我有以下功能:
def get_denom(n_comp,qs,x,cp,cs):
'''
len(n_comp) = 1 # number of proteins
len(cp) = n_comp # protein concentration
len(qp) = n_comp # protein capacity
len(x) = 3*n_comp + 1 # fit parameters
len(cs) = 1
'''
k = x[0:n_comp]
sigma = x[n_comp:2*n_comp]
z = x[2*n_comp:3*n_comp]
a = (sigma + z)*( k*(qs/cs)**(z-1) )*cp
denom = np.sum(a) + cs
return denom
subroutine get_denom (qs,x,cp,cs,n_comp,denom)
! Calculates the denominator in the SMA model (Brooks and Cramer 1992)
! The function is called at a specific salt concentration and isotherm point
! I loops over the number of components
implicit none
! declaration of input variables
integer, intent(in) :: n_comp ! number of components
double precision, intent(in) :: cs,qs ! salt concentration, free ligand concentration
double precision, dimension(n_comp), INTENT(IN) ::cp ! protein concentration
double precision, dimension(3*n_comp + 1), INTENT(IN) :: x ! parameters
! declaration of local variables
double precision, dimension(n_comp) :: k,sigma,z
double precision :: a
integer :: i
! declaration of outpur variables
double precision, intent(out) :: denom
k = x(1:n_comp) ! equlibrium constant
sigma = x(n_comp+1:2*n_comp) ! steric hindrance factor
z = x(2*n_comp+1:3*n_comp) ! charge of protein
a = 0.
do i = 1,n_comp
a = a + (sigma(i) + z(i))*(k(i)*(qs/cs)**(z(i)-1.))*cp(i)
end do
denom = a + cs
end subroutine get_denom
f2py -c -m get_denom get_denom.f95 --fcompiler=gfortranf2py -c -m get_denom_vec get_denom.f95 --fcompiler=gfortran --f90flags='-msse2'(最后一个选项应启用自动矢量化)import numpy as np
import get_denom as fort_denom
import get_denom_vec as fort_denom_vec
from matplotlib import pyplot as plt
%matplotlib inline
def get_denom(n_comp,qs,x,cp,cs):
k = x[0:n_comp]
sigma = x[n_comp:2*n_comp]
z = x[2*n_comp:3*n_comp]
# calculates the denominator in Equ 14a - 14c (Brooks & Cramer 1992)
a = (sigma + z)*( k*(qs/cs)**(z-1) )*cp
denom = np.sum(a) + cs
return denom
n_comp = 100
cp = np.tile(1.243,n_comp)
cs = 100.
qs = np.tile(1100.,n_comp)
x= np.random.rand(3*n_comp+1)
denom = np.empty(1)
%timeit get_denom(n_comp,qs,x,cp,cs)
%timeit fort_denom.get_denom(qs,x,cp,cs,n_comp)
%timeit fort_denom_vec.get_denom(qs,x,cp,cs,n_comp)
import cython
# import both numpy and the Cython declarations for numpy
import numpy as np
cimport numpy as np
@cython.boundscheck(False)
@cython.wraparound(False)
def get_denom(int n_comp,np.ndarray[double, ndim=1, mode='c'] qs, np.ndarray[double, ndim=1, mode='c'] x,np.ndarray[double, ndim=1, mode='c'] cp, double cs):
cdef int i
cdef double a
cdef double denom
cdef double[:] k = x[0:n_comp]
cdef double[:] sigma = x[n_comp:2*n_comp]
cdef double[:] z = x[2*n_comp:3*n_comp]
# calculates the denominator in Equ 14a - 14c (Brooks & Cramer 1992)
a = 0.
for i in range(n_comp):
#a += (sigma[i] + z[i])*( pow( k[i]*(qs[i]/cs), (z[i]-1) ) )*cp[i]
a += (sigma[i] + z[i])*( k[i]*(qs[i]/cs)**(z[i]-1) )*cp[i]
denom = a + cs
return denom
def get_denom_numexp(n_comp,qs,x,cp,cs):
k = x[0:n_comp]
sigma = x[n_comp:2*n_comp]
z = x[2*n_comp:3*n_comp]
# calculates the denominator in Equ 14a - 14c (Brooks & Cramer 1992)
a = ne.evaluate('(sigma + z)*( k*(qs/cs)**(z-1) )*cp' )
return cs + np.sum(a)
ne.set_num_threads(1) # using just 1 thread
%timeit get_denom_numexp(n_comp,qs,x,cp,cs)
最佳答案
用过了。
好的,最后,我们被允许在我们的一个盒子上安装numpy等,这可能是对你原来的文章的一个全面的解释。
简而言之,你最初的问题在某种意义上是“错误的问题”。此外,其中一位撰稿人滥用和误传了许多令人恼火的信息,这些错误和捏造值得注意,以免有人误相信这些错误,并为此付出代价。
另外,我决定将这个答案作为一个单独的答案提交,而不是出于如下所示的原因和适当性编辑我4月14日的答案。
A部分:操作的答案
首先,处理原始帖子中的问题:您可能还记得,我只能对Fortran方面进行WRT评论,因为我们的政策严格要求安装哪些软件以及在我们的机器上安装在哪里,而且我们还没有准备好python等(直到现在)。我也反复说过,你的结果的特点是有趣的,我们可以称之为弯曲的特点,或者说是“凹陷”。
此外,纯粹使用“相对”结果(因为您没有发布绝对计时,而且我当时也没有麻木感),我曾多次指出,其中可能隐藏着一些重要信息。
事实就是这样。
首先,我想确保我可以复制您的结果,因为我们通常不使用python/f2py,所以在您的结果中不明显包含了什么编译器设置等,所以我执行了各种测试,以确保我们在与苹果交谈(我4月14日的回答表明,调试与恢复租赁/O2有很大区别)。
图1显示了我对以下三种情况的python结果:原始的python/numpy内部子程序(称为p,我只是剪切/粘贴原始文件)、原始的基于do的fortran s/r(称为fdo,和以前一样,我只是复制/粘贴原始文件)和其中一种变体i had之前建议依赖数组部分,因此需要sum()(调用这个fsas,通过编辑原始fdo创建)。图1显示了通过timeit的绝对计时。
图2显示了基于相对策略(除以python/numpy(p)计时)的相对结果。仅显示两个(相对)Fortran变体。
很明显,这些复制了你最初的情节中的角色,我们可能相信我的测试似乎与你的测试一致。
现在,您最初的问题是:“为什么随着数组大小的增加,Fortran的速度越来越接近numpy?”.
事实上,事实并非如此。纯粹是依靠“相对”时间安排的假象/扭曲,可能会给人留下这样的印象。
从图1可以看出,在绝对计时的情况下,numpy和fortran显然在分散。所以,事实上,如果你愿意的话,Fortran的结果是从numpy开始的,反之亦然。
一个更好的问题,也是在我之前的评论中反复出现的一个问题,是为什么这些向上弯曲在第一位(例如c.f.线性)?我以前的fortran-only结果显示了一个“基本上”平坦的相对性能比(4月14日图表/答案中的黄线),因此我推测在python方面发生了一些有趣的事情,并建议进行检查。
有一种方法可以证明这一点,那就是使用一种不同的相对度量。我用它自己的最高值(即n_comp=10 k)来划分每个(绝对)系列,以了解这种“内部相对”性能是如何展开的(那些被称为??10 k值,表示n_comp=10000)的计时。图3显示了p、fdo和fsas作为p/p10k、fdo/fdo10K和fsas/fsas10K的这些结果。为了清楚起见,y轴具有对数刻度。很明显,随着p结果的n_comp c.f.的降低,Fortran变种的表现相对更好(例如红圈注释部分)。
换言之,Fortran在减小数组大小方面非常(非线性)高效。不清楚为什么python会因为减少n_comp而做得这么糟糕…但它确实存在,而且可能存在内部开销/设置等问题,以及解释程序与编译器之间的差异等。
所以,并不是Fortran“追赶”了Python,相反,它继续与Python保持距离(见图1)。然而,随着n_comp的减少,python和fortran之间的非线性差异产生了明显反直觉和非线性的“相对”计时。
因此,随着n_comp的增加和每个方法“稳定”到一个或多或少的线性模式,曲线变平,以表明它们的差异是线性增长的,并且相对比率固定到一个近似常数(忽略内存争用、SMP问题等)。这很容易看出n_comp是否允许大于10000,但4月14日我的答案中的黄线已经显示了这一点,仅针对Fortran的S/R。
旁白:我的偏好是创建自己的定时例程/函数。时间似乎很方便,但在那个“黑匣子”里面有很多事情。设置自己的循环和结构,确定定时功能的属性/分辨率对于正确评估很重要。
关于python - 性能比较Fortran,Numpy,Cython和Numexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387340/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem
是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案