Abstract
使用Python,似乎就与高性能没多大关系了。但毕竟作为一个Python入门者,而且是把Python用于机器学习,数据挖掘这样计算量庞大的任务,还是应该尽可能提升程序的性能。又,即使不是做数据相关,写任何代码也是该尽可能地避免一些低效的操作。一个月前,做数据挖掘课程作业时,编写的Python版本的LFM模型计算耗时之巨,完全无法接受,粗略估算:完成整个模型的训练需要昼夜不停执行一个月时间。而后,使用C++重新编写才勉强完成,上交作业。
基于上述,买书时在《Python数据科学手册》与《Python高性能编程》之中选择了后者。书中各种提升性能的方式非常绚丽繁复,但现阶段所能用者,预计不过十一,故只做粗略翻阅,于眼下有益处做简要笔记,余下各种奇淫技巧待到研究生期间再来细细学习。
书名:《Python高性能编程》
作者:Micha Gorelick, Ian Ozsvald
译者:胡世杰,徐旭彬
出版社:人民邮电出版社
利用CPU的矢量操作
1
2
3
4
5
6
7
8
9
10import math
def (number):
sqrt_number = num.sqrt(number)
number_float = float(number)
for i in xrange(2, int(sqrt_number) + 1):
if (number_float / i).is_integer():
return False
return True
CPU的矢量操作不需要额外的时间代价,意味着它可以一次进行多个独立计算。利用这一特性,理想的计算模型如下代码所示:
1
2
3
4
5
6
7
8
9
10
11
12
13import math
def (number):
sqrt_number = num.sqrt(number)
number_float = float(number)
numbers = range(2, int(sqrt_number) + 1)
for i in xrange(0, len(numbers), 5):
result = (number_float / numbers[i : (i + 5)]).is_integer()
if any(result):
return False
return True
理解Python GIL
对于Python来说,充分利用多核性能的阻碍主要在于Python的全局解释器所(GIL)。GIL确保Python进城一次只能执行一条指令,无论当前有多少个核。
解决方案:
multiprocessing标准库
numexpr标准库
Cython