我试图了解为什么我的一个python脚本比gfortran慢了约4倍,我必须这样做:
import numpy as np
nvar_x=40
nvar_y=10
def fn_tst(x):
for i in range(int(1e7)):
y=np.repeat(x,1+nvar_y)
return y
x = np.arange(40)
y = fn_tst(x)
print y.min(),y.max()
Run Code Online (Sandbox Code Playgroud)
这比以下fortran代码慢大约13倍
module test
integer,parameter::nvar_x=40,nvar_y=10
contains
subroutine fn_tst(x,y)
real,dimension(nvar_x)::x
real,dimension(nvar_x*(1+nvar_y))::y
do i = 1,10000000
do k = 1,nvar_x
y(k)=x(k)
ibeg=nvar_x+(k-1)*nvar_y+1
iend=ibeg+nvar_y-1
y(ibeg:iend)=x(k)
enddo
enddo
end subroutine fn_tst
end module test
program tst_cp
use test
real,dimension(nvar_x)::x
real,dimension(nvar_x*(1+nvar_y))::y
do k = 1,nvar_x
x(k)=k-1
enddo
call fn_tst(x,y)
print *,minval(y),maxval(y)
stop
end
Run Code Online (Sandbox Code Playgroud)
你能否提出加速python脚本的方法.其他指向numpy良好性能的指针将不胜感激.我宁愿坚持使用python而不是为fortran例程构建python包装器.
谢谢
@isedev,是的,就是这样.1.2s gfortran与6.3s for Python?这是我第一次担心性能,但正如我所说,在我试图加速的代码中,我只能使用Python获得大约四分之一的速度.
对,抱歉代码没有做同样的事情.实际上,您在循环中指示的内容更像我在原始代码中所拥有的内容.
除非我遗漏了什么,否则我不同意最后的陈述:我必须在fn_tst中创建y.和np.repeat只是RHS上的一个术语(将o/p直接放在现有数组中).如果我注释掉np.repeat术语的话很快......
rhs_slow …Run Code Online (Sandbox Code Playgroud) 有人可以解释下面的'-5'.我对numpy有些新意,但这看起来很奇怪
In [112]: an_int=9
In [113]: an_int/2
Out[113]: 4
In [114]: range(-an_int/2,an_int/2)
Out[114]: [-5, -4, -3, -2, -1, 0, 1, 2, 3]
In [115]: arange(-an_int/2,an_int/2)
Out[115]: array([-5, -4, -3, -2, -1, 0, 1, 2, 3])
In [116]: range(-4,4)
Out[116]: [-4, -3, -2, -1, 0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)