我编写了以下程序来比较 python 和 c/fortran 的速度。 为了获得程序使用的时间,我使用了“时间”命令。所有 程序计算 xx+yy+z*z 的平方根,其中 x、y、z 是 float 。 我使用了平方根,因为它是最耗时的部分之一 科学计算,我参与其中。
我有以下时间:
fortran 0m29.9s //
c 0m20.7s //
python 30m10.8s
根据我做的简单测试发现Python不推荐用于 科学计算。但可能我的代码效率很低。
您认为我可以仅针对这个简单的测试用例提高我的代码的效率吗?
语言:
program root_square
implicit none
integer i,j
real x,y,z,r
x=1.0
y=2.0
z=3.0
do j=1,3000
do i=1,1000000
r=sqrt(x*x+y*y+z*z)
enddo
enddo
end program root_square
C:
#include "stdio.h"
#include "math.h"
int main (void)
{
float x=1.0,y=2.0,z=3.0,r;
int i,j;
for(j=0; j<3000; j++){
for(i=0; i<1000000; i++) {
r=sqrt(x*x+y*y+z*z);
}
}
return 0;
}
python :
#!/usr/bin/env python
from math import sqrt
x = 1.0
y = 2.0
z = 3.0
for j in range(1,3001):
for i in range(1,1000001):
r = sqrt(x*x+y*y+z*z)
最佳答案
我最近做了a similar test使用更现实的现实世界算法。它涉及 numpy、Matlab、FORTRAN 和 C#(来自 ILNumerics)。如果没有特定的优化,numpy 生成的代码似乎比其他代码效率低得多。当然——一如既往——这只能表明一种普遍趋势。您将能够编写最终运行速度比相应的 numpy 实现慢的 FORTRAN 代码。但大多数时候,numpy 会慢得多。这是我测试的(平均)结果:
为了像您的示例中这样简单的浮点运算计时,一切都归结为编译器生成“最佳”机器指令的能力。在这里,涉及多少编译步骤并不重要。 .NET 和 numpy 通过首先编译为字节码然后在虚拟机中执行来利用多个步骤。但优化结果的选项同样存在——理论上。在实践中,现代 FORTRAN 和 C 编译器在优化执行速度方面做得更好。例如,他们利用浮点扩展(SSE、AVX)并进行更好的循环展开。 numpy(或更好的 CPython,主要由 numpy 使用)在这一点上似乎表现更差。如果您想确保哪个框架最适合您的任务,您可以附加调试器并调查可执行文件的最终机器指令。
但是,请记住,在更现实的场景中,浮点性能仅在大型优化链的末端才重要。这种差异通常被更强大的影响所掩盖:内存带宽。一旦你开始处理数组(这在大多数科学应用中很常见),你就必须考虑内存管理的成本。框架在支持算法作者编写内存高效算法方面有所不同。在我看来,numpy 使得编写内存高效算法比 FORTRAN 或 C 更难。但在任何这些语言中都不容易。 (ILNumerics 大大改善了这一点。)
另一个重点是并行化。该框架是否支持您并行执行计算?它的效率如何?还是我个人的观点:C、FORTRAN 和 numpy 都不能轻松地并行化你的算法。但是 FORTRAN 和 C 至少给了你这样做的机会,即使它有时需要使用特殊的编译器。其他框架(ILNumerics、Matlab)会自动并行化。
如果您需要非常小但昂贵的算法的“峰值性能”,您最好使用 FORTRAN 或 C。只是因为它们最终会生成更好的机器代码(在单处理器系统上)。然而,在考虑内存效率和并行性的情况下,用 C 或 FORTRAN 编写更大的算法通常会变得很麻烦。在这里,高级语言(如 numpy、ILNumerics 或 Matlab)胜过低级语言。如果做得对 - 执行速度的差异通常可以忽略不计。不幸的是,对于 numpy 的情况通常不是这样。
关于python - 将 python 与 c/fortran 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439869/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的: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?并散列所有无济于事。
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。