我不确定这是否更像是一个操作系统问题,但我想我会问这里,以防任何人从Python的结尾有一些见解.
我一直在尝试使用一个CPU密集型for循环joblib,但是我发现不是将每个工作进程分配给不同的核心,我最终将它们全部分配到同一个核心而没有性能提升.
这是一个非常简单的例子......
from joblib import Parallel,delayed
import numpy as np
def testfunc(data):
# some very boneheaded CPU work
for nn in xrange(1000):
for ii in data[0,:]:
for jj in data[1,:]:
ii*jj
def run(niter=10):
data = (np.random.randn(2,100) for ii in xrange(niter))
pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
results = pool(delayed(testfunc)(dd) for dd in data)
if __name__ == '__main__':
run()
Run Code Online (Sandbox Code Playgroud)
...这是我在htop脚本运行时看到的内容:

我在一台4核的笔记本电脑上运行Ubuntu 12.10(3.5.0-26).显然joblib.Parallel是为不同的工作者生成单独的进程,但有没有办法让这些进程在不同的内核上执行?
是否有一种高性能方法可以将 numpy 数组转换为 FORTRAN 有序 ctypes 数组,理想情况下不需要副本,并且不会触发与步幅相关的问题?
\nimport numpy as np\n\n# Sample data\nn = 10000\nA = np.zeros((n,n), dtype=np.int8)\nA[0,1] = 1\n\ndef slow_conversion(A):\n return np.ctypeslib.as_ctypes(np.ascontiguousarray(A.T))\n\nassert slow_conversion(A)[1][0] == 1\nRun Code Online (Sandbox Code Playgroud)\n仅调用as_ctypes的性能分析:
\n%%timeit\nnp.ctypeslib.as_ctypes(A)\nRun Code Online (Sandbox Code Playgroud)\n3.35 \xc2\xb5s \xc2\xb1 每个循环 10.5 ns(意味着 \xc2\xb1 标准偏差 7 次运行,每次 100000 次循环)
\n所提供的(慢速)转换的性能分析
\n%%timeit\nslow_conversion(A)\nRun Code Online (Sandbox Code Playgroud)\n206 ms \xc2\xb1 每个循环 10.4 ms(平均 \xc2\xb1 标准偏差 7 次运行,每次 1 次循环)
\n理想的结果是获得与调用类似的性能as_ctypes。
我需要在Python中调用Fortran模块中的例程.我用f2py和做了python2.7.它工作得很好.
现在,我必须使用它,python3但f2py似乎不兼容python3.
我看到有些人使用的是一个名为的版本f2py3,但它既pip不是通过macports也不是通过macports(我使用的是Mac).此外,python3 + numpy + f2py似乎已经集成在Fedora中.
有没有人设法在Mac上使用f2py3(或等效)python3?如果没有,您建议将Fortran库与哪些替代解决方案相关联python3?
我试图计算大约十万点之间的所有距离.我有以下代码用Fortran编写并使用以下代码编译f2py:
C 1 2 3 4 5 6 7
C123456789012345678901234567890123456789012345678901234567890123456789012
subroutine distances(coor,dist,n)
double precision coor(n,3),dist(n,n)
integer n
double precision x1,y1,z1,x2,y2,z2,diff2
cf2py intent(in) :: coor,dist
cf2py intent(in,out):: dist
cf2py intent(hide)::n
cf2py intent(hide)::x1,y1,z1,x2,y2,z2,diff2
do 200,i=1,n-1
x1=coor(i,1)
y1=coor(i,2)
z1=coor(i,3)
do 100,j=i+1,n
x2=coor(j,1)
y2=coor(j,2)
z2=coor(j,3)
diff2=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2)
dist(i,j)=sqrt(diff2)
100 continue
200 continue
end
Run Code Online (Sandbox Code Playgroud)
我正在使用以下python代码编译fortran代码setup_collision.py:
# System imports
from distutils.core import *
from distutils import sysconfig
# Third-party modules
import numpy
from numpy.distutils.core import Extension, setup
# Obtain the numpy include directory. …Run Code Online (Sandbox Code Playgroud)