मैं एक पायथन कोड के एक हिस्से को तेज करने की कोशिश कर रहा हूं जिसमें मेरे पास निम्न कोड है:

for i in range(n):
   for j in range(m):
       for (sign,idx) in [(a,b),(c,d),(e,f),(g,h)]:
           array[idx,i] += sign * something
           array[idx,j] += sign * somethingElse

जहाँ a,b,c... अपेक्षाकृत जटिल व्यंजक हैं।

अगर मैं मैन्युअल रूप से लिखकर इनर लूप के लिए अनियंत्रित करता हूं:

for i in range(n):
   for j in range(m):
           sign,idx = a,b
           array[idx,i] += sign * something
           array[idx,j] += sign * somethingElse
           sign,idx = c,d
           array[idx,i] += sign * something
           array[idx,j] += sign * somethingElse
           sign,idx = e,f
           array[idx,i] += sign * something
           array[idx,j] += sign * somethingElse
           sign,idx = g,h
           array[idx,i] += sign * something
           array[idx,j] += sign * somethingElse

कोड 4 गुना तेज चलता है... लेकिन कॉपी-पेस्ट करना एक बुरा विचार लगता है।

मेरा प्रश्न: क्या यह संकलन समय पर स्वचालित रूप से किया जा सकता है?

1
N. Gast 7 अप्रैल 2020, 16:59

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि यह वास्तव में टाइपिंग की समस्या है: test1() में, मैं स्पष्ट रूप से एक सरणी "मान" बनाता हूं जबकि test2() में मैं हर बार इस सरणी का निर्माण करता हूं।

def test1():
    cdef int i
    cdef int value
    cdef int values[4]
    cdef double sum = 0
    values[:] = [1,2,3,4]
    for i in range(1000000):
        for value in values:
            sum += values[j]
    return sum

def test2():
    cdef int i
    cdef int value
    cdef double sum = 0
    for i in range(1000000):
        for value in [1,2,3,4]: 
            sum += value
    return sum

पहला संस्करण लगभग 3 गुना तेज है:

%timeit test1()
4.4 ms ± 44.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit test2()
13.3 ms ± 44.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
1
N. Gast 7 अप्रैल 2020, 19:01