gpt4 book ai didi

python - 为什么这段代码在 Cython 中比在 Python 中慢?

转载 作者:太空狗 更新时间:2023-10-29 17:50:39 26 4
gpt4 key购买 nike

由于性能问题,我开始学习 Cython。此特定代码试图在交通建模(用于规划)领域实现一些新算法。

我决定从一个非常简单的函数开始,我会使用很多次(数亿次)并且肯定会从性能提升中受益。

我用三种不同的方式实现了这个功能,并针对相同的参数(为了简单起见)分别测试了 1000 万次:

  • cython 模块中的 Cython 代码。运行时间:3.35s

  • Cython 模块中的 Python 代码。运行时间:4.88s

  • 主脚本上的 Python 代码。运行时间:2.98s

    如您所见,cython 代码比 cython 模块中的 python 代码慢 45%,比主脚本上编写的代码慢 64%。这怎么可能?我哪里出错了?

cython代码是这样的:

def BPR2(vol, cap, al, be):
con=al*pow(vol/cap,be)
return con


def func (float volume, float capacity,float alfa,float beta):
cdef float congest
congest=alfa*pow(volume/capacity,beta)
return congest

测试脚本是这样的:

agora=clock()
for i in range(10000000):
q=linkdelay.BPR2(10,5,0.15,4)

agora=clock()-agora
print agora

agora=clock()
for i in range(10000000):
q=linkdelay.func(10,5,0.15,4)

agora=clock()-agora
print agora

agora=clock()
for i in range(10000000):
q=0.15*pow(10/5,4)

agora=clock()-agora
print agora

我知道先验函数(幂)变慢等问题,但我认为这不应该成为问题。

由于在函数空间中查找函数会产生开销,如果我为函数传递一个数组并返回一个数组,是否有助于提高性能?我可以使用用 Cython 编写的函数返回数组吗?

作为引用,我正在使用:

  • Windows 7 64 位
  • Python 2.7.3 64 位
  • Cython 0.16 64 位
  • Windows Visual Studio 2008

最佳答案

测试使用:

for i in range(10000000):
func(2.7,2.3,2.4,i)

结果如下:

cdef float func(float v, float c, float a, float b):
return a * (v/c) ** b
#=> 0.85

cpdef float func(float v, float c, float a, float b):
return a * (v/c) ** b
#=> 0.84

def func(v,c,a,b):
return a * pow(v/c,b)
#=> 3.41

cdef float func(float v, float c, float a, float b):
return a * pow(v/c, b)
#=> 2.35

为了获得最高效率,您需要在 C 中定义函数并将返回类型设置为静态。

关于python - 为什么这段代码在 Cython 中比在 Python 中慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11194666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com