关于 python 并行计算的问题

2016-11-25 20:46:16 +08:00
 fffflyfish

大家好,这两天遇到一个运算速度的问题,就是我的程序是关于图像处理的,有的函数是要通过把一张图片的每个像素点扫描,然后计算一些值,比如这样一个场景:有一张画布,上面有 3 个元素,我现在要计算每个空白位置的像素点与这三个元素之间的最短距离,这样如果画布面积太大,就会导致算法运行时间过长,实测的话 800x600 的画布,将这个函数循环迭代 600 次,就得耗时 10 个小时+,所以我想通过并行计算来试试,因为目前的服务器配置是 8 核 E5 2650V3 的,感觉自己的程序只用到了一个核。但是关于这方面的知识我不是很懂,所以请教一下各位,谢谢!

4023 次点击
所在节点    Python
27 条回复
fffflyfish
2016-11-27 20:09:22 +08:00
@congeec 没,就是普通的 pillow
linhua
2016-11-27 22:06:53 +08:00
fffflyfish
2016-11-28 00:24:24 +08:00
@linhua 哇,简直不能更 cool ,谢谢!
congeec
2016-11-29 03:46:09 +08:00
@fffflyfish 如果底层还是 pillow ,用 cpu 算,还是建议试试 simd 版本
fffflyfish
2016-11-29 14:03:53 +08:00
@congeec 嗯,之前查过了,这个 simd 版本对 cpu 并行有过优化,可以可以,谢谢啦
justou
2016-12-02 17:11:58 +08:00
我实际操作了下你这个问题, 把问题简化成了: 计算图片上到若干像素距离最短的位置, 效率并不算太差啊
到 3, 10, 30, 81 个像素最短距离的计算时间分别是: 160 ms, 460 ms, 1.34 s, 3.55 s, 时间线性递增, 还没用 opencl 试
(注: 当点数过多的时候最短距离的位置不一定只有一个)

https://gist.github.com/justou/b64a0b73fe198a2b6cdb1c72b3459ad8
fffflyfish
2016-12-02 20:43:25 +08:00
@justou 好优雅的代码!不过你现在把画布上的一个元素简化成了一个像素点(就是你代码里随机产生的位置),但是对于我现在做的东西来说,这个元素是不能简单的以一个像素点来看待,必须是一个 bounding box , 比如说一张广告,上面的标题元素,比如字号为 60 ,那么它占的像素面积就是一个 axb 大小的矩形框,如果求图片空白区域的每个像素点(无元素的地方)到它的距离,这就有点麻烦了,因为这个元素也是有很多像素点的, 我现在用的方法是 python 里的 scipy 的 distance_transform_edt 函数,链接: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.ndimage.morphology.distance_transform_edt.html


这是目前我找到的最好的解决方法,但是计算时间还是不理想,这两天在看 multiprocess 的东西,应该会有用。

非常感谢您能腾出时间来考虑我的问题,谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/323341

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX