2015-01-21 16 views
5

निम्न दो काम करता है, पर विचार के लिए numpy की तुलना में तेज छोरों के लिए कर रहे हैं जो अनिवार्य रूप से गुणा एक बड़ा अनुक्रम में हर नंबर के साथ एक छोटी सी अनुक्रम एक 2D सरणी का निर्माण करने, और उसके बाद में हर संख्या में सभी मान दोगुना हो जाता है सरणी noloop() 2 डी NumPy सरणी के प्रत्यक्ष गुणन का उपयोग करता है और परिणाम देता है, जबकि loop() पाश के लिए एक का उपयोग करता है arr1 से अधिक पुनरावृति और धीरे-धीरे एक आउटपुट सरणी का निर्माण करने के।क्यों 2 डी सरणी गुणा

import numpy as np 

arr1 = np.random.rand(100, 1) 
arr2 = np.random.rand(1, 100000) 

def noloop(): 
    return (arr1*arr2)*2 

def loop(): 
    out = np.empty((arr1.size, arr2.size)) 
    for i in range(arr1.size): 
     tmp = (arr1[i]*arr2)*2 
     out[i] = tmp.reshape(tmp.size) 
    return out 

मैं noloop की उम्मीद बहुत तेजी से भी पुनरावृत्तियों की एक छोटी संख्या के लिए हो सकता है, लेकिन के लिए सरणी से ऊपर आकार, loop वास्तव में तेजी से होता है: दिलचस्प

>>> %timeit noloop() 
10 loops, best of 3: 64.7 ms per loop 
>>> %timeit loop() 
10 loops, best of 3: 41.6 ms per loop 

और, यदि मैं दोनों में *2 को दूर वें के लिए एक अच्छा विवरण

>>> %timeit noloop() 
10 loops, best of 3: 29.4 ms per loop 
>>> %timeit loop() 
10 loops, best of 3: 34.4 ms per loop 

है वहाँ: काम करता है, noloop तेजी से होता है, लेकिन केवल थोड़ा ese परिणाम, और क्या एक ही कार्य करने के लिए एक उल्लेखनीय तेज़ तरीका है?

+2

मैं 'noloop()'() 'पाश की तुलना में तेजी से किया जा रहा (द्वारा ~ 15%)' परवाह किए बिना ... –

+0

मैं भी पर रिवर्स मिल दोनों पायथन 2 और पायथन 3। –

+1

मैं ', तेजी से होने के रूप में ओ पी पता चलता है (मेरी मशीन में 28% से) loop'। पायथन 3.4.1 | एनाकोंडा 2.1.0, IPython 2.2.0 – Roberto

उत्तर

0

मैं आपके परिणामों को पुन: उत्पन्न करने में सक्षम नहीं था, लेकिन मुझे पता चला कि मुझे numpy.multiply का उपयोग करके पर्याप्त गति (2 का कारक) मिल सकता है। out तर्क का उपयोग करके आप इस तथ्य का लाभ ले कि स्मृति को पहले से ही आवंटित किया जाता है और out करने के लिए tmp की नकल समाप्त कर सकते हैं।

def out_loop(): 
    out = np.empty((arr1.size, arr2.size)) 
    for i in range(arr1.size): 
     np.multiply(arr1[i], arr2, out=out[i].reshape((1, arr2.size))) 
     out[i] *= 2 
    return out 

मेरी मशीन पर परिणाम:

In [32]: %timeit out_loop() 
100 loops, best of 3: 17.7 ms per loop 

In [33]: %timeit loop() 
10 loops, best of 3: 28.3 ms per loop 
संबंधित मुद्दे