我使用numpy在python中编写物理模拟代码,然后将其重写为C ++。在C ++中,它只需要0.5秒,而在python中大约需要40秒。有人可以帮助我找到我做得非常糟糕的错误吗?
import numpy as np
def myFunc(i):
uH = np.copy(u)
for j in range(1, xmax-1):
u[i][j] = a*uH[i][j-1]+(1-2*a)*uH[i][j]+a*uH[i][j+1]
u[i][0] = u[i][0]/b
for x in range(1, xmax):
u[i][x] = (u[i][x]+a*u[i][x-1])/(b+a*c[x-1])
for x in range(xmax-2,-1,-1):
u[i][x]=u[i][x]-c[x]*u[i][x+1]
xmax = 101
tmax = 2000
#All other variables are defined here but I removed that for visibility
uH = np.zeros((xmax,xmax))
u = np.zeros((xmax,xmax))
c = np.full(xmax,-a)
uH[50][50] = 10000
for t in range(1, tmax):
if t % 2 == 0:
for i in range(0,xmax):
myFunc(i)
else:
for i in range(0, xmax):
myFunc(i)
如果有人想要运行它,那么整个代码是:http://pastebin.com/20ZSpBqQ 编辑:所有变量都在整个代码中定义,可以在pastebin上找到。很抱歉混淆,我认为删除所有混乱将使代码更容易理解
答案 0 :(得分:2)
从根本上说,C是一种编译语言,当Python是一种解释型语言时,速度易于使用。
Numpy可以填补空白,但你必须避免循环使用经常需要的项目 一些技巧。
例如,
def block1():
for i in range(xmax):
for j in range(1, xmax-1):
u[i][j] = a*uH[i][j-1]+(1-2*a)*uH[i][j]+a*uH[i][j+1]
采用numpy风格:
def block2():
u[:,1:-1] += a*np.diff(u,2)
with更短更快(更容易阅读和理解?):
In [37]: %timeit block1()
10 loops, best of 3: 25.8 ms per loop
In [38]: %timeit block2()
10000 loops, best of 3: 123 µs per loop
最后,你可以使用Just In Time编译加速numpy代码,这是Numba允许的。只需更改代码的开头,如:
import numba
@numba.jit
def myFunc(u,i):
...
并且myFunc(u,i)
在脚本末尾的调用(u
必须是自动确定类型的参数),您将达到相同的性能(我的PC上为0.4秒)
答案 1 :(得分:0)
因此,当我运行你的numpy python代码时,它花了四分钟运行,一旦我删除了numpy代码并用标准python代码替换它只需要一分钟! (我的电脑不是那么快)
这是代码:
.\Autologon.exe -n guest10 -d test.com -p Password1 -accepteula yes
我相信如果你以正确的方式使用numpy而不是替换数组,这可能会快得多,但是,不使用numpy数组会将时间缩短到原来的1/4。