Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更快的代码numpy_Python_Performance_Numpy - Fatal编程技术网

Python 更快的代码numpy

Python 更快的代码numpy,python,performance,numpy,Python,Performance,Numpy,我正在用Matlab编写Python脚本。碰巧在Matlab中,代码运行得更快(比如少10分钟),所以也许你可以帮我找出我做错了什么。我用Python运行了所有会话,发现最慢的是以下两个会话: X = xi * math.cos(theta) + zi * (math.sin(theta)) Y = yi Z = xi * ((-1) * math.sin(theta)) + zi * (math.cos(theta)) x2 = [a * b * c * X[i] / np.sqrt((a

我正在用Matlab编写Python脚本。碰巧在Matlab中,代码运行得更快(比如少10分钟),所以也许你可以帮我找出我做错了什么。我用Python运行了所有会话,发现最慢的是以下两个会话:

X = xi * math.cos(theta) + zi * (math.sin(theta))
Y = yi
Z = xi * ((-1) * math.sin(theta)) + zi * (math.cos(theta))

x2 = [a * b * c * X[i] / np.sqrt((a * c * Y[i])**2 + b**2 * (
    c**2 * (X[i])**2 + a**2 * (Z[i])**2)) for i in range(len(X))]
y2 = [a * b * c * Y[i] / np.sqrt((a * c * Y[i])**2 + b**2 * (
    c**2 * X[i]**2 + a**2 * Z[i]**2)) for i in range(len(X))]
zt = c**2 * (1 - (x2 / a)**2 - (y2 / b)**2)
i = 0
z2 = []
for i in range(len(Z)):
    z2.append((-1 if Z[i] < 0 else 1) * np.sqrt(zt[i]))
<代码> x=席*数学。 Y=yi Z=席*((- 1)*数学。Sin(θ))+Zi*(数学。COS(θ)) x2=[a*b*c*X[i]/np.sqrt((a*c*Y[i])**2+b**2*( c**2*(X[i])**2+a**2*(Z[i])**2)用于范围(len(X))] y2=[a*b*c*Y[i]/np.sqrt((a*c*Y[i])**2+b**2*( c**2*X[i]**2+a**2*Z[i]**2)表示范围内的i(len(X))] zt=c**2*(1-(x2/a)**2-(y2/b)**2) i=0 z2=[] 对于范围内的i(len(Z)): z2.追加((-1,如果Z[i]<0,则为1)*np.sqrt(zt[i])) < >席、彝、子是100万余个元素

的浮标 感谢您提供z2部分

In [1]: import numpy as np
In [2]: zz =np.array([1, 2, 3, -1, -2, -3, 0])
In [3]: aa = np.array([1, 2, 3, 4, 5, 6, 64])
In [4]: Z =np.array([1, 2, 3, -1, -2, -3, 0])
In [5]: zt = np.array([1, 2, 3, 4, 5, 6, 64])
In [6]: np.sign(Z) * np.sqrt(zt)
Out[7]: 
array([ 1., 1.41421356, 1.73205081, -2., -2.23606798, -2.44948974, 0. ])

(1) 少10分钟并不意味着什么。1对11;100对110?(2) 做一些真实的分析,也许用line_profiler。可能包括输出(3)你真的在那个循环中对超过百万个元素求和吗?(4) 列表附加在复杂性方面非常慢(编辑:这里我似乎错了或不准确;但请尝试以下方法)!预先分配一个数组。你现在的尺寸是先验的!(5) 最后一行也可以用numpy矢量化。@sascha:
list.append
是摊销固定时间;是
numpy.append
具有可怕的时间复杂性。哎呀。。。我监督了所有那些隐藏的清单理解。这不是如何使用numpy(避免循环和列表理解;尝试处理完整向量)!读一些numpy文档。你的代码似乎把所有的numpy增益都扔掉了!我不会显示一些代码,也许其他人会。为什么?因为我更喜欢代码,我们也可以复制和运行代码(有时还需要一些您正在做的事情的背景资料)!在移植matlab代码时,您应该已经可以使用更矢量化的方法(给定matlab代码)。然后MATLAB有大量的jit编译,可以让您定义快速运行的迭代代码
numpy
更像旧的MATLAB,需要“矢量化”的整个数组操作。有
numpy
工具来处理迭代,但首先要尝试在没有所有列表理解的情况下使其工作。他们很慢。事实上,我在这些列表中看不到任何东西不是矢量化的,所以这应该很容易。只需删除方括号、for语句和所有索引。