我在Windows上使用Python 3并试图构建一个玩具示例,演示使用多个CPU内核如何加快计算速度。玩具示例是Mandelbrot分形的渲染。
至今:
但是,无论是由于开销还是没有实际的多重处理,我都无法证明任何加速。因此,具有明显加速性的玩具示例指针将非常有帮助:-)
编辑: 谢谢!这将我推向正确的方向,现在我得到了一个可行的示例,该示例演示了具有4个内核的CPU的速度提高了一倍。
我的代码的副本与“讲义”在这里:https :
//pastebin.com/c9HZ2vAV
我决定使用Pool(),但稍后将尝试@ 16num指出的“ Process”替代方法。下面是Pool()的代码示例:
p = Pool(cpu_count())
#Unlike map, starmap only allows 1 input. "partial" provides a workaround
partial_calculatePixel = partial(calculatePixel, dataarray=data)
koord = []
for j in range(height):
for k in range(width):
koord.append((j,k))
#Runs the calls to calculatePixel in a pool. "hmm" collects the output
hmm = p.starmap(partial_calculatePixel,koord)
演示多处理速度非常简单:
import multiprocessing
import sys
import time
# multi-platform precision clock
get_timer = time.clock if sys.platform == "win32" else time.time
def cube_function(num):
time.sleep(0.01) # let's simulate it takes ~10ms for the CPU core to cube the number
return num**3
if __name__ == "__main__": # multiprocessing guard
# we'll test multiprocessing with pools from one to the number of CPU cores on the system
# it won't show significant improvements after that and it will soon start going
# downhill due to the underlying OS thread context switches
for workers in range(1, multiprocessing.cpu_count() + 1):
pool = multiprocessing.Pool(processes=workers)
# lets 'warm up' our pool so it doesn't affect our measurements
pool.map(cube_function, range(multiprocessing.cpu_count()))
# now to the business, we'll have 10000 numbers to quart via our expensive function
print("Cubing 10000 numbers over {} processes:".format(workers))
timer = get_timer() # time measuring starts now
results = pool.map(cube_function, range(10000)) # map our range to the cube_function
timer = get_timer() - timer # get our delta time as soon as it finishes
print("\tTotal: {:.2f} seconds".format(timer))
print("\tAvg. per process: {:.2f} seconds".format(timer / workers))
pool.close() # lets clear out our pool for the next run
time.sleep(1) # waiting for a second to make sure everything is cleaned up
当然,在这里我们只是模拟10ms /数字的计算,您可以cube_function
用任何CPU负担的方法代替实际演示。结果符合预期:
Cubing 10000 numbers over 1 processes:
Total: 100.01 seconds
Avg. per process: 100.01 seconds
Cubing 10000 numbers over 2 processes:
Total: 50.02 seconds
Avg. per process: 25.01 seconds
Cubing 10000 numbers over 3 processes:
Total: 33.36 seconds
Avg. per process: 11.12 seconds
Cubing 10000 numbers over 4 processes:
Total: 25.00 seconds
Avg. per process: 6.25 seconds
Cubing 10000 numbers over 5 processes:
Total: 20.00 seconds
Avg. per process: 4.00 seconds
Cubing 10000 numbers over 6 processes:
Total: 16.68 seconds
Avg. per process: 2.78 seconds
Cubing 10000 numbers over 7 processes:
Total: 14.32 seconds
Avg. per process: 2.05 seconds
Cubing 10000 numbers over 8 processes:
Total: 12.52 seconds
Avg. per process: 1.57 seconds
现在,为什么不100%线性?嗯,首先,它需要一些时间来图/数据分配给子流程,并把它找回来,有一些成本的上下文切换,还有一些用我的CPU不时其他任务,time.sleep()
不是完全精确(也不可能在非RT
OS上使用)…但是结果大致上可用于并行处理。
本文向大家介绍Python 多核并行计算的示例代码,包括了Python 多核并行计算的示例代码的使用技巧和注意事项,需要的朋友参考一下 以前写点小程序其实根本不在乎并行,单核跑跑也没什么问题,而且我的电脑也只有双核四个超线程(下面就统称核好了),觉得去折腾并行没啥意义(除非在做IO密集型任务)。然后自从用上了32核128GB内存,看到 htop 里面一堆空载的核,很自然地就会想这个并行必须去折腾一
本文向大家介绍python+matplotlib演示电偶极子实例代码,包括了python+matplotlib演示电偶极子实例代码的使用技巧和注意事项,需要的朋友参考一下 使用matplotlib.tri.CubicTriInterpolator.演示变化率计算: 完整实例: 总结 以上就是本文关于python+matplotlib演示电偶极子实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可
本文向大家介绍Python方法的延迟加载的示例代码,包括了Python方法的延迟加载的示例代码的使用技巧和注意事项,需要的朋友参考一下 数据挖掘的过程中,数据进行处理是一重要的环节,我们往往会将其封装成一个方法,而有的时候这一个方法可能会被反复调用,每一次都对数据进行处理这将是一个很耗时耗资源的操纵,那么有没有办法将计算后的结果 缓存 起来达到 调用一次,处处运行 的效果,经过一番研究在 lazy
问题内容: 我有一个小的代码示例,我想在方法的Javadoc注释中包括它。 问题是代码示例显示在Javadoc中,没有换行符,很难阅读。 我猜我认为代码标签可以处理换行符是错误的。格式化Javadoc注释中的代码示例的最佳方法是什么? 问题答案: 除了已经提到的标签之外,您还应该使用JavaDoc注释,当涉及到HTML实体问题(尤其是泛型)时,这将使工作变得更加轻松,例如: 将给出正确的HTML输
学习目标: 通过一个简单完整的MVC实例,了解控制器文件(Controller)、模型文件(Model)、视图文件(View)的所在的目录路径。更好地理解DoitPHP框架的开发规则。 创建数据表: DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `user_id` mediumint(8) unsigned NOT NULL AUTO
本文向大家介绍python验证码识别的示例代码,包括了python验证码识别的示例代码的使用技巧和注意事项,需要的朋友参考一下 写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类 今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等方法来增加识别难度。 相应的,验证码识别大体