用cython提升python的性能

Boosting performance with Cython

Even with my old pc (AMD Athlon II, 3GB ram), I seldom run into performance issues when running vectorized code. But unfortunately there are plenty of cases where that can not be easily vectorized, for example the drawdown function. My implementation of such was extremely slow, so I decided to use it as a test case for speeding things up. I‘ll be using the SPY timeseries with ~5k samples as test data. Here comes the original version of my drawdown function (as it is now implemented in the TradingWithPython library)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

def drawdown(pnl):

    """

    calculate max drawdown and duration

    Returns:

        drawdown : vector of drawdwon values

        duration : vector of drawdown duration

    """

    cumret = pnl

    highwatermark = [0]

    idx = pnl.index

    drawdown = pd.Series(index = idx)

    drawdowndur = pd.Series(index = idx)

    for t in range(1, len(idx)) :

        highwatermark.append(max(highwatermark[t-1], cumret[t]))

        drawdown[t]= (highwatermark[t]-cumret[t])

        drawdowndur[t]= (0 if drawdown[t] == 0 else drawdowndur[t-1]+1)

    return drawdown, drawdowndur

%timeit drawdown(spy)

1 loops, best of 3: 1.21 s per loop

Hmm 1.2 seconds is not too speedy for such a simple function. There are some things here that could be a great drag to performance, such as a list *highwatermark* that is being appended on each loop iteration. Accessing Series by their index should also involve some processing that is not strictly necesarry. Let‘s take a look at what happens when this function is rewritten to work with numpy data

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

def dd(s):

#    ‘‘‘ simple drawdown function ‘‘‘

    

    highwatermark = np.zeros(len(s))

    drawdown = np.zeros(len(s))

    drawdowndur = np.zeros(len(s))

 

    for t in range(1,len(s)):

        highwatermark[t] = max(highwatermark[t-1], s[t])

        drawdown[t] = (highwatermark[t]-s[t])

        drawdowndur[t]= (0 if drawdown[t] == 0 else drawdowndur[t-1]+1)

       

     

    return drawdown , drawdowndur

%timeit dd(spy.values)

10 loops, best of 3: 27.9 ms per loop

Well, this is much faster than the original function, approximately 40x speed increase. Still there is much room for improvement by moving to compiled code with cython Now I rewrite the dd function from above, but using optimisation tips that I‘ve found on the cython tutorial .

时间: 2024-10-09 07:46:55

用cython提升python的性能的相关文章

7个提升Python程序性能的好习惯

原文作者:爱coding,会编程的核电工程师. 个人博客地址:zhihu.com/people/zhong-yun-75-63 掌握一些技巧,可尽量提高Python程序性能,也可以避免不必要的资源浪费. 1.使用局部变量 尽量使用局部变量代替全局变量:便于维护,提高性能并节省内存. 使用局部变量替换模块名字空间中的变量,例如 ls = os.linesep.一方面可以提高程序性能,局部变量查找速度更快:另一方面可用简短标识符替代冗长的模块变量,提高可读性. 2.减少函数调用次数 对象类型判断时,

[转] Python 代码性能优化技巧

选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化来提高程序的执行效率.如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下

Python 代码性能优化技巧(转)

原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进.在算法的时间复杂度排序上依次是: O(1) -> O(lg n) -> O(

提升python代码运行的5种方法?

不论什么语言我们都需要注意性能优化问题,提高执行效率.选择了脚本语言就要忍受其速度,这句话在某种程度上说明了Python作为脚本语言的不足之处,那就是执行效率和性能不够亮.尽管Python从未如C和Java一般快速,但是不少Python项目都处于开发语言领先位置. Python很简单易用,但大多数人使用Python都知道在处理密集型cpu工作时,它的数量级依然低于C.Java和JavaScript.但不少第三方不愿赘述Python的优点,而是决定自内而外提高其性能.如果你想让Python在同一硬

psutil 是因为该包能提升 memory_profiler 的性能

python 性能分析入门指南 一点号数据玩家昨天 限时干货下载:添加微信公众号"数据玩家「fbigdata」" 回复[7]免费获取[完整数据分析资料!(包括SPSS.SAS.SQL.EXCEL.Project)!] 英文:yexiaobai 译文:yexiaobai 虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 用 time 粗粒度的计算时间 $time pythonyou

用Cython加速Python到“起飞”

https://www.jianshu.com/p/fc5025094912?from=singlemessage 事先声明,标题没有把“Python”错打成“Cython”,因为要讲的就是名为“Cython”的东西. Cython是让Python脚本支持C语言扩展的编译器,Cython能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库.由于Python固有的性能差的问题,用C扩展Python成为提高Python性能常用方法,Cy

jQuery 做好七件事帮你提升jQuery的性能

1. Append Outside of Loops 凡是触及到DOM都是有代价的.如果你向DOM当中附加大量的元素,你会想一次性将它们全部附加进来,而不是分多次进行.当在循环当中附加元素就会产生一个常见的问题. 1 $.each( myArray, function( i, item ) { 2 3 var newListItem = "<li>" + item + "</li>"; 4 5 $( "#ballers"

采用表达式树提升属性访问性能

项目背景, 采用贫血模式, 但希望在使用业务实体机业务规则上的数据属性,使用同一规则. 比如:在页面中, “RS_Department.Code" , "Department.Code"都可以正常访问. 业务实体类 直接使用Linq to Sql 自动生成的代码,跟数据库表一一对应. 如:RS_Requisition, RS_Department 业务规则类 实现数据库增删改查,扩展属性,其他业务规则等. public class Requisition : BLLTable

Python脚本性能剖析

################### #Python脚本性能剖析 ################### cProfile/profile/hotshot用于统计Python脚本各部分运行频率和耗费时间等统计信息.pstats可用于格式化这些信息 cProfile,属C扩展.开销较小,适合剖析长时间执行的Python程序,推荐使用此模块 profile.纯Python模块,存在明显开销,但想对其扩展的话相对照较easy hotshot,实验性的C模块.主要关注开销最小化,现已不再被维护将来可能