2

我知道 Python 有一个全局锁,并且我已经阅读了 Glyph 对python multithreading的解释。但我还是想试试看。作为一项简单(概念上)的任务,我决定做的是对图片进行水平和垂直边缘检测。

这是正在发生的事情(伪代码):

for pixels in picture:
    apply sobel operator horizontal
for pixels in picture:
    apply sobel operator vertical

关于 sobel 运算符的信息。

这两个循环可以完全独立运行,因此是多线程的主要候选者。(在任何非常大的图片上运行这两个循环可能需要 10 多秒)。但是,当我尝试threading在 python 中使用该模块时,由于全局锁,它需要两倍的时间。我的问题是我是否应该放弃在 python 的两个线程中执行此操作并尝试使用另一种语言的所有希望?如果我可以继续前进,我应该使用什么模块?如果不是,我应该尝试什么语言?

4

5 回答 5

7

Python 2.6 现在包括mulitprocessing模块(以前是旧版本 Python 上的处理模块)。

它与线程模块具有基本相同的接口,但将执行启动到单独的进程而不是线程中。与线程模块方法相比,这使 Python 可以利用多个内核/CPU,并且可以很好地扩展 CPU 密集型任务。

于 2009-02-11T04:10:34.207 回答
3

如果 sobel 运算符受 CPU 限制,那么您将不会从多线程中获得任何好处,因为 python 没有利用多核。

可以想象,您可以拆分多个进程,但我不确定这对于处理单个图像是否实用。

10 秒似乎不会浪费太多时间。如果您因为要处理许多图像而担心时间,那么运行多个进程并让每个进程处理图像的单独子集可能会更容易。

于 2009-02-11T03:50:21.260 回答
2

我也推荐使用 NumPy。它不仅可能会更快,而且如果你使用线程,就不会有全局锁。

我还建议按照 Jay 的建议使用多处理。

无论如何,如果你真的想练习线程,我建议在 C 中使用 PThreads。PThreads 在基本情况下使用起来非常简单,并且可以在所有地方使用。

于 2009-02-11T07:50:58.187 回答
0

像 Sobel 算子这样的大容量矩阵运算肯定会通过(正确)使用Matlab/Octave实现显着的速度提升。NumPy可能会为矩阵/数组操作提供类似的加速。

于 2009-02-11T04:24:28.120 回答
0

Python mutliprocessing is the right choice if you want to practice parallel programming with Python. If you don't have Python 2.6 (which you don't if you're using Ubuntu for example), you can use the Google code backported version of multiprocessing. It is part of PyPI, which means you can easily install it using EasyInstall (which is part of the python-setuptools package in Ubuntu).

于 2009-02-13T13:18:03.107 回答