न्यूम्बा संख्यात्मक कोड के निष्पादन में तेजी लाने के लिए एक अच्छा समाधान प्रतीत होता है। हालांकि, जब एक सरणी के लिए असाइनमेंट होते हैं तो मानक पाइथन कोड से धीमा लगता है। इस उदाहरण पर विचार करें, बिना किसी निंबा/स्केलर के चार विकल्पों की तुलना में,एक सरणी को आवंटित करते समय Numba धीमा?
(इस मुद्दे पर ध्यान केंद्रित करने के लिए गणना को उद्देश्य पर बहुत सरल रखा गया था, जो एक सरणी के लिए एक स्केलर बनाम असाइनमेंट के लिए असाइनमेंट है सेल)
@autojit
def fast_sum_arr(arr):
z = arr.copy()
M = len(arr)
for i in range(M):
z[i] += arr[i]
return z
def sum_arr(arr):
z = arr.copy()
M = len(arr)
for i in range(M):
z[i] += arr[i]
return z
@autojit
def fast_sum_sclr(arr):
z = 0
M = len(arr)
for i in range(M):
z += arr[i]
return z
def sum_sclr(arr):
z = 0
M = len(arr)
for i in range(M):
z += arr[i]
return z
IPython के% timeit का उपयोग करते हुए चार विकल्प मुझे मिल गया मूल्यांकन करने के लिए:
In [125]: %timeit fast_sum_arr(arr)
100 loops, best of 3: 10.8 ms per loop
In [126]: %timeit sum_arr(arr)
100 loops, best of 3: 4.11 ms per loop
In [127]: %timeit fast_sum_sclr(arr)
100000 loops, best of 3: 10 us per loop
In [128]: %timeit sum_sclr(arr)
100 loops, best of 3: 2.93 ms per loop
sum_arr, जो Numba साथ संकलित नहीं किया गया है दोगुनी गति से fast_sum_arr, के रूप में की तुलना में अधिक है जो नुंबा के साथ संकलित किया गया था। दूसरी तरफ, fast_sum_sclr, जो नुम्बा के साथ संकलित था, sum_sclr की तुलना में तीव्रता के दो से अधिक आदेश है, जिसे नुंबा के साथ संकलित नहीं किया गया था।
तो नुंबा sum_sclr को तेज़ करने का कार्य उल्लेखनीय रूप से अच्छी तरह से करता है लेकिन वास्तव में sum_arr धीमा निष्पादित करता है। Sum_sclr और sum_arr के बीच एकमात्र अंतर यह है कि पूर्व स्केलर को असाइन करता है जबकि बाद वाला सरणी सेल को असाइन करता है।
अगर कोई संबंध है मैं नहीं जानता, लेकिन मैं हाल ही में ब्लॉग http://www.phi-node.com/ पर निम्न को पढ़ें:
"ऐसा लगता है कि जब Numba किसी भी निर्माण के साथ सामना कर रहा है यह सीधे समर्थन नहीं करता है, यह एक (बहुत) धीमी कोड पथ पर स्विच करता है। "
ब्लॉग लेखक को पाइथन के अधिकतम() के बजाय एक कथन का उपयोग करके नुंबा को बहुत तेज़ प्रदर्शन करने के लिए मिला।
इस पर कोई अंतर्दृष्टि?
धन्यवाद,
एफएस
मुझे समझ में नहीं आता कि आपका लूप क्या कर रहा है। क्या यह प्रभावी रूप से 'z [1:] + = arr [1:]' नहीं है, या चूंकि 'z' और' r' के समान मान हैं, 'z [1:] * = 2'? मैं उम्मीद करता हूं कि किसी स्पष्ट लूप की तुलना में बहुत तेज हो, लेकिन मुझे उम्मीद नहीं है कि एक कंपाइलर बताने में सक्षम हो। – Blckknght