我需要從特定的面/頂點列表中計算最小值,最大值和平均值。我試圖用Numpy優化這個計算,但沒有成功。純Python比Numpy更快嗎?我可以使這個numpy代碼更快嗎?
這是我的測試用例:
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
'''
Module Started 22 févr. 2013
@note: test case comparaison numpy vs python
@author: Python4D/damien
'''
import numpy as np
import time
def Fnumpy(vertices):
np_vertices=np.array(vertices)
_x=np_vertices[:,:,0]
_y=np_vertices[:,:,1]
_z=np_vertices[:,:,2]
_min=[np.min(_x),np.min(_y),np.min(_z)]
_max=[np.max(_x),np.max(_y),np.max(_z)]
_mean=[np.mean(_x),np.mean(_y),np.mean(_z)]
return _mean,_max,_min
def Fpython(vertices):
list_x=[item[0] for sublist in vertices for item in sublist]
list_y=[item[1] for sublist in vertices for item in sublist]
list_z=[item[2] for sublist in vertices for item in sublist]
taille=len(list_x)
_mean=[sum(list_x)/taille,sum(list_y)/taille,sum(list_z)/taille]
_max=[max(list_x),max(list_y),max(list_z)]
_min=[min(list_x),min(list_y),min(list_z)]
return _mean,_max,_min
if __name__=="__main__":
vertices=[[[1.1,2.2,3.3,4.4]]*4]*1000000
_t=time.clock()
print ">>NUMPY >>{} for {}s.".format(Fnumpy(vertices),time.clock()-_t)
_t=time.clock()
print ">>PYTHON>>{} for {}s.".format(Fpython(vertices),time.clock()-_t)
的結果是:
numpy的:
([1.1000000000452519,2.2000000000905038,3.3000000001880174],[1.1000000000000001,2.2000000000000002,3.2999999999999998 ],[1.1000000000000001,2.2000000000000002,3.2999999999999998])爲27.327068618s。
的Python:
([1.100000000045252,2.200000000090504,3.3000000001880174],[1.1,2.2,3.3],[1.1,2.2,3.3])爲1.81366938593s。
純Python的速度比Numpy快15倍!
此行速度較慢,爲'np_vertices = np.array(頂點)'。你並不是真正計算最小和最大函數的時間,你需要花費多長時間來整理嵌套的引用 – YXD 2013-02-22 14:36:16
你應該編輯你的問題,使我認爲是你隱含的問題,「我可以使這個numpy代碼更快?「,明確表示接近選票的意圖。 – tacaswell 2013-02-22 14:38:41
通過僅使用numpy構造(也用於構建'頂點'),您可以大大加快代碼的速度。 – 2013-02-24 07:08:38