PCa*_*rgo 12 python performance cython
由于性能问题,我开始学习Cython.该特定代码试图在运输建模(用于计划)区域中实现一些新算法.
我决定从一个非常简单的功能开始,我将使用很多(数亿次)并且肯定会从性能提升中受益.
我以三种不同的方式实现了这个功能,并测试它们的相同参数(为简单起见),每个1000万次:
主脚本上的Python代码.运行时间:2.98秒
如您所见,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
Run Code Online (Sandbox Code Playgroud)
测试脚本是这样的:
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
Run Code Online (Sandbox Code Playgroud)
我知道超越函数(幂)的问题比较慢,但我认为这应该是一个问题.
由于在函数空间中查找函数有开销,如果我为函数传递一个数组并返回一个数组,它会有助于性能吗?我可以使用Cython编写的函数返回数组吗?
供参考,我正在使用: - Windows 7 64位 - Python 2.7.3 64位 - Cython 0.16 64位 - Windows Visual Studio 2008
这个函数可以这样优化(在 python 和 cython 中,删除中间变量更快):
def func(float volume, float capacity, float alfa,f loat beta):
return alfa * pow(volume / capacity, beta)
Run Code Online (Sandbox Code Playgroud)