【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路!
代码地址:https://github.com/apatrascu/hunting-python-performance
目次
一、情况设置
二、内存分析
三、CPU 分析——Python 脚本
四、CPU 分析——Python 说冥器
本文是该教程的第一部分,重要大年夜情况设置和内存分析两个方面商量Python代码优化的路径。

一、情况设置
设置
在深刻到基准测试和机能分析之前,起首我们须要一个合适的情况。这意味着我们须要为这项义务设备我们的机械和操作体系。
cpufreq stats: 2.30 GHz:100.00%, 2.20 GHz:0.00%, 2.10 GHz:0.00%, 2.00 GHz:0.00%, 1.90 GHz:0.00%, 1.80 GHz:0.00%, 1.70 GHz:0.00%, 1.60 GHz:0.00%, 1.50 GHz:0.00%, 1.40 GHz:0.00%, 1.30 GHz:0.00%, 1.20 GHz:0.00% (174)
我的机械的规格如下:
- 处理器:Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz
- 内存:32GB
- 操作体系:Ubuntu 16.04 LTS
- Kernel:4.4.0-75-generic
我们的目标是获得可复现的结不雅,是以要确保我们的数据不会受到其它后台过程、操作体系设备或任何其它硬件机能晋升技巧的影响。
让我们起首大年夜设备用于机能分析的机械开端。
起首,禁用所有硬件机能功能,也就是说要禁用 Intel Turbo Boost 和 Hyper Threading from BIOS/UEFI。
正如其官方网页上说的那样,Turbo Boost 是「一种在处理器内核运行,并可以在低于功耗、电流和温度规格限制的情况下许可它们以高于额定频率的速度运行的技巧。」此外,Hyper Threading 是「一种可以更高效地应用处理器资本的技巧,能使每个内核都能多线程运行。」
这都是值得我们花钱购买的好器械。那为什么要在机能分析/基准测试中禁用它们呢?因为应用这些技巧会让我们无法获得靠得住的和可复现的结不雅。这会让运行过程产生变更。让我们看个小例子 primes.py,代码有意写得很糟糕。
import time
import statistics
def primes(n):
if n==2:
return [2]
return []
s=range(3,n+1,2)
mroot = n ** 0.5
half=(n+1)/2-1
i=0
m=3
while m <= mroot:
if s[i]:
j=(m*m-3)/2
s[j]=0开端测量时,应用以下 PyPy 敕令:
while j<half:
s[j]=0
j+=m
m=2*i+3
return [2]+[x for x in s if x]
def benchmark():
results = []
gstart = time.time()
for _ in xrange(5):
count = len(primes(1000000))
end = time.time()
results.append(end-start)
gend = time.time()
mean = statistics.mean(results)
perc = (stdev * 100)/ mean
driver: acpi-cpufreq
i=i+1
print "Benchmark duration: %r seconds" % (gend-gstart)
elif n<2:
72 59.554688 MiB 0.000000 MiB while j < half:
print "Mean duration: %r seconds" % mean
print "Standard deviation: %r (%r %%)" % (stdev, perc)
benchmark()
这段代码可在 GitHub 上查看:https://github.com/apatrascu/hunting-python-performance/blob/master/01.primes.py。你须要运行以下敕令安装一个依附包:
pip install statistics
让我们在一个启用了 Turbo Boost 和 Hyper Threading 的体系中运行它:
74 59.554688 MiB 0.000000 MiB j += m
python primes.py
Benchmark duration: 1.0644240379333496 seconds
Mean duration: 0.2128755569458008 seconds
Standard deviation: 0.032928838418120374 (15.468585914964498 %)
如今禁用该体系的睿频加快(Turbo Boost)和超线程(Hyper Threading),然后再次运行这段代码:
python primes.py
Benchmark duration: 1.2374498844146729 seconds
Mean duration: 0.12374367713928222 seconds
Standard deviation: 0.000684464852339824 (0.553131172568 %)
available cpufreq governors: conservative, ondemand, userspace, powersave, performance
看看第一个案例的标准差为 15%。这是一个很大年夜的值!假设我们的优化只能带来 6% 的加快,那我们怎么能将运行过程中的变更(run to run variation)和你的实现的差别区分开?相对而言,在第二个例子中,标准差削减到了大年夜约 0.6%,我们的新优化筹划效不雅清楚可见。
CPU 节能
禁用所有的 CPU 节能设置,并应用固定的 CPU 频率。这可以经由过程在 Linux 功率调节器(power governor)中将 intel_pstate 改成 acpi_cpufreq 而实现。
intel_pstate 驱动应用英特尔内核(Sandy Bridge 或更新)处理器的内部调节器实现了一个缩放驱动。acpi_cpufreq 应用了 ACPI Processor Performance States。
下面让我们先来检查一下:
推荐阅读
【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路! 读者自行测验测验可以想看源码戳这(https://github.com/damonare/Sorts),博主在github建了个库,读者可以>>>详细阅读
地址:http://www.17bianji.com/lsqh/36268.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示