C中的代码运行速度比NumPy快得多

时间:2017-03-11 19:23:35

标签: python numpy

我使用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上找到。很抱歉混淆,我认为删除所有混乱将使代码更容易理解

2 个答案:

答案 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。