1

我刚刚在 python3 中遇到了一些奇怪的性能“问题”/“增益”。以下代码加载 5 个权重矩阵并将它们应用于相当大的数据集。这样做时,它将每一行写入磁盘。

当我执行这个程序时,所有八个处理器都被它占用了 100%。

python会自动在多个线程上执行程序吗?如果是这样,是否有这方面的任何文件?如果不是,这个程序怎么会在一个八核上消耗所有 8 个处理器?

#!/usr/bin/python3
import numpy
import struct
from scipy.special import expit
from dA import load_data
from dA import load_wb
import sys

if __name__ == '__main__':
   stages=[2223,723,172,84,21]
   wb=[]
   for stage in stages:
      w,b=load_wb("%d" % (stage))
      print(numpy.max(w))
      wb.append((w,b))

   data=load_data()
   n=data.shape[0]
   dimensions=stages[-1]
   filename="%d.data" % (dimensions)
   chunk=">"+('f'*dimensions)
   with open(filename,"wb") as f:
      for i in range(n):
         row=data[i]
         for (w, b) in wb:
            row=2*expit(2*(numpy.dot(row,w)+b))-1
         s=struct.pack(chunk,*row)
         f.write(s)
4

2 回答 2

1

我最近读到了一篇关于这个主题的有趣文章,我认为这对你来说可能很有趣:Python 由于无法原生使用多个 CPU 内核而受到阻碍。现在 Pythonistas 的目标是找到一个解决方案。为了回答你的问题,我引用文章的第一段。

对于 Python 的所有强大而方便的特性,一个目标仍然遥不可及:在 CPython 参考解释器上运行并并行使用多个 CPU 内核的 Python 应用程序。... 事实上,在 Python 应用程序中使用线程是可能的——其中很多已经这样做了。CPython 不可能运行多线程应用程序,每个线程在不同的内核上并行执行。CPython 的内部内存管理不是线程安全的,因此解释器一次只运行一个线程,根据需要在它们之间切换并控制对全局状态的访问。

所以,简短的回答是:可以在 Python 中运行多个线程,但目前它不会自动并行使用多个内核。但是,实现此功能的工作已经开始。

另外,我应该指出,这是关于 CPython,Python 的参考实现。不幸的是,我不知道其他实现是否有相同的问题。

于 2016-06-14T19:01:55.623 回答
1

使用八个内核的原因是因为在 Linux 上,如果可用,BLAS 会自动使用它们。所以处理器时间主要花在 numpy.dot 操作上。

于 2016-06-14T18:37:36.080 回答