编辑2:有人建议这是一个类似问题的副本。我不同意,因为我的问题集中在速度上,而另一个问题询问什么更“可读”或“更好”(没有定义更好)。虽然问题相似,但给出的讨论/答案却有很大差异。EDIT:IrealisefromthequestionsthatIcouldhavebeenclearer.Sorryforcodetypos,yesitshouldbeusingtheproperpythonoperatorforaddition.Regardingtheinputdata,Ijustchosealistofrandomnumberssincethat'sacommonsample.Inm
我最近遇到了一个greatSOpost其中一位用户建议numpy.sum在处理NumPy数组时比Python的sum更快。这让我想到,使用NumPy函数对NumPy数组进行逐元素操作是否比使用运算符更快?如果是这样,那为什么会这样?考虑以下示例。importnumpyasnpa=np.random.random(1e10)b=np.random.random(1e10)np.subtract(a,b)是否确实比a-b更快? 最佳答案 不,不是很重要。np.sum比sum快的原因是sum被实现为“天真地”迭代可迭代对象(在本例中,
我一直在一个管理大型单词列表的项目中工作,并通过大量测试来验证列表中的每个单词是否通过。有趣的是,每次我使用“更快”的工具(如itertools模块)时,它们似乎都变慢了。最后我决定问这个问题,因为我可能做错了什么。以下代码将尝试测试any()函数与使用循环的性能。#!/usr/bin/python3#importtimefromunicodedataimportnormalizefile_path='./tests'start=time.time()withopen(file_path,encoding='utf-8',mode='rt')asf:tests_list=f.read(
我正在使用Python进行一些科学计算,其中包含大量几何计算,我发现使用numpy与使用标准math库之间存在显着差异。>>>x=timeit.Timer('v=np.arccos(a)','importnumpyasnp;a=0.6')>>>x.timeit(100000)0.15387153439223766>>>y=timeit.Timer('v=math.acos(a)','importmath;a=0.6')>>>y.timeit(100000)0.012333301827311516这超过了10倍的加速!我将numpy用于几乎所有标准数学函数,我只是假设它经过优化并且至少与
我一直根据生成器表达式往往比普通循环更有效的理论进行操作。但后来我遇到了下面的例子:写了一个函数,给定一个数N和一些因数ps,返回下所有数字的总和N是至少一个因数的倍数。这是一个循环版本和一个更短的生成器表达式版本:defloops(N,ps):total_sum=0foriinxrange(N):forpinps:ifi%p==0:total_sum+=ibreakreturntotal_sumdefgenexp(N,ps):returnsum(iforiinxrange(N)ifany(i%p==0forpinps))我原以为两者的表现大致相当,也许理解版本快一点,但我没想到的是:
这是基于thisquestion问2018-10.考虑以下代码。计算NumPy3D数组(1000×1000×1000)中非零元素的三个简单函数。importnumpyasnpdeff_1(arr):returnnp.sum(arr>0)deff_2(arr):ans=0forvalinrange(arr.shape[0]):ans+=np.sum(arr[val,:,:]>0)returnansdeff_3(arr):returnnp.count_nonzero(arr)if__name__=='__main__':data=np.random.randint(0,10,(1_000,
在python中,我们可以通过两种方式连接列表:lst.extend(another_lst)lst+=another_lst我认为extend会比使用+=更快,因为它会重用列表而不是使用其他两个创建新列表。但是当我用timeit测试时,结果是+=更快,>>>timeit('l.extend(x)','l=range(10);x=range(10)')0.16929602623>>>timeit('l+=x','l=range(10);x=range(10)')0.15030503273>>>timeit('l.extend(x)','l=range(500);x=range(100)
我通常从numpy的einsum函数中获得良好的性能(我喜欢它的语法)。@Ophion对thisquestion的回答表明-对于测试的案例-einsum始终优于“内置”功能(有时略胜一筹,有时胜过很多)。但是我刚刚遇到了einsum慢很多的情况。考虑以下等效函数:(M,K)=(1000000,20)C=np.random.rand(K,K)X=np.random.rand(M,K)deffunc_dot(C,X):Y=X.dot(C)returnnp.sum(Y*X,axis=1)deffunc_einsum(C,X):returnnp.einsum('ik,km,im->i',X,C
我有一个很长的列表(300000个元素),我想检查该列表中的每个元素是否存在超过5次。所以最简单的代码是[xforxinx_listifx_list.count(x)>5]但是,我不需要统计x在列表中出现的频率,我可以在达到至少5个元素后停止计数吗?我也不需要遍历x_list中的所有元素,因为我有可能在遍历列表时已经更早地检查了值x。知道如何获得此代码的最佳版本吗?我的输出应该是一个列表,如果可能,顺序相同...... 最佳答案 下面是基于Counter的解决方案:fromcollectionsimportCounteritems=
引自“PythonProgramming:AnIntroductiontoComputerScience”Wecouldhavetakenthesquarerootusingexponentiation**.Usingmath.sqrtissomewhatmoreefficient.“有点”,但程度如何,如何? 最佳答案 理论上,hammar'sanswer和duffymo'sanswer是很好的猜测。但实际上,在我的机器上,它并不更有效率:>>>importtimeit>>>timeit.timeit(stmt='[n**0.5f