定义PI的动机是什么?
PI=4.D0*DATAN(1.D0)
Run Code Online (Sandbox Code Playgroud)
在Fortran 77代码中?我理解它是如何工作的,但是,理由是什么?
我调整了一个简单的程序来计算和绘制Julia的运动漩涡以测试语言,我也用Python编写它没有特别的原因.
(免责声明:1.我读过的stackoverflow的每一次性能比较都因为没有全面/正确/写得好/相关等等而受到抨击 - 我不是假装这是一个真正的比较,我只想知道如何制作朱莉娅更快.2.我知道python可以优化,在Cython等中实现,这不是讨论的一部分,它只是在这里为Julia和Python中的等效函数的参考.)
代码和性能结果可以在一个要点中看到.
Julia的表现明显慢于Fortran.执行计算所花费的时间是(50000个时间步长):
Fortran: 0.051s
Julia: 2.256s
Python: 30.846s
Run Code Online (Sandbox Code Playgroud)
朱莉娅比Fortran慢得多(慢44倍),差距缩小但仍然显着,时间步长增加10倍(0.50s vs 15.24s).
这些结果与julia主页上显示的结果有很大不同.我究竟做错了什么?我可以修快朱莉娅吗?
我在Julia主页上浏览了Julia Performance Tips页面和比较背后的代码,没有什么能让我解决.
同样有趣的是,Julia加载PyPlot(5secsish !!)非常慢,而且比Python读取文本文件要慢得多.我可以做些什么来改善这些事情吗?
请注意,上面的时间不显示Julia和Python的加载时间,它只是计算AFAIK所需的原始时间 - 请参阅代码.对于fortran来说,这就是整个事情.在每种情况下,绘图都已大致关闭以允许速度比较.
计算机:Intel i7-3770,16GB RAM,SSD HD,操作系统:Ubuntu 13.10 64bit.,Fortran:gfortran,GNU Fortran(Ubuntu/Linaro 4.8.1-10ubuntu9)4.8.1,Julia:版本0.3.0-prerelease + 396 (2013-12-12 00:18 UTC),提交c5364db*(0天大师),x86_64-linux-gnu,Python:2.7.5+
根据ivarne的建议,我重新编写了Julia脚本(在上面的gist中更新):在函数中封装grunt工作,声明所有内容的类型,并在适用的情况下将矩阵的不同元素拆分为不同的数组.(我在很多地方都包含了Float64,因为我尝试了Float32,看看是否有帮助,但大部分时间都没有).
结果如下:
50,000 时间步骤:
Fortran: 0.051s (entire programme)
Julia: raw calc.: 0.201s, calc. and return (?): 0.758s, total exec.: 6.947s
Run Code Online (Sandbox Code Playgroud)
500,000 时间步骤:
Fortran: 0.495s (entire programme)
Julia: raw calc.: 1.547s, …Run Code Online (Sandbox Code Playgroud) 如果要从用户读取的字符串包含空格,则在Fortran中使用read(星号,星号)似乎不起作用.请考虑以下代码:
character(Len = 1000) :: input = ' '
read(*,*) input
Run Code Online (Sandbox Code Playgroud)
如果用户输入字符串"Hello,我的名字是John Doe",则只有"Hello"将存储在输入中; 空间被忽视后的一切.我的假设是编译器假定"Hello"是第一个参数,而"my"是第二个,所以要捕获其他单词,我们必须使用read(,)input1,input2,input3之类的东西. ......这种方法的问题是我们需要为每个输入创建大字符数组,并且需要确切地知道将输入多少个单词.有没有办法解决??有些功能会实际读取整个句子,空格和所有内容吗?非常感谢!
我有一个看起来像这样的Fortran77代码段:
DO 1301 N=NMLK-2,2,-1
Some code...
IF(NB1(N).EQ.50) GOTO 1300
Some code...
IF(BS(N).EQ.0.0) GOTO 1301
some code...
GOTO 1301
1300 NW(M)=NB1(N)
Some code...
1301 CONTINUE
Run Code Online (Sandbox Code Playgroud)
当它击中GOTO 1301语句时,这会跳转到循环的下一次迭代还是退出循环?据我所知,return关键字什么都不做,所以我假设这只是退出循环并继续从标签1301执行代码,这是正确的吗?
我正在将其翻译成C#,我想知道这是否相同:
for (N = NMLK; N >= 2; N--)
{
Some code...
if (NB1[N] == 50)
goto l1300;
Some code...
if (BS[N] == 0)
return;
Some code...
return;
l1300:
NW[M] = NB1[N];
Some code...
}
Run Code Online (Sandbox Code Playgroud)
或者如果我应该"继续"而不是"返回"?
我明白gfortran可以编译f90或f95吗?它如何知道它正在编译哪一个?还可以编译f77代码吗?ubuntu已经有了fortran编译器,还是需要下载gfortran?
这个问题是关于线性搜索的效率与连续存储中预排序数组的二进制搜索的效率...
我有一个用fortran编写的应用程序(77!).我的部分代码的一个常见操作是在数组中找到索引gx(i) <= xin < gx(i+1).我目前已经实现了这个binary search- 对于声明标签而言goto- 并且- 我已经评论了使用fortran 90的等效声明...
i=1
ih=nx/2
201 continue !do while (.true.)
if((xin.le.gx(i)).and.(xin.gt.gx(i+1)))then !found what we want
ilow=i+1; ihigh=i
s1=(gx(ihigh)-xin)/(gx(ihigh)-gx(ilow))
s2=1.0-s1
return
endif
if(i.ge.ih)then
goto 202 !exit
endif
if(xin.le.(gx(ih))then !xin is in second half of array
i=ih
ih=nx-(nx-ih)/2
else !xin is in first half of array
i=i+1
ih=i+(ih-i)/2
endif
goto 201 !enddo
Run Code Online (Sandbox Code Playgroud)
然而,今天,我正在维基百科上阅读二进制搜索,我发现了这个:
Binary search can interact poorly with the memory hierarchy
(i.e. caching), because of its random-access …Run Code Online (Sandbox Code Playgroud) 我想读取一个文件中的一行,其中包含三个实数,而不会使指针前进.所以我写道:( TXT是代表我的文件的变量,其值为80)
read(TXT, *, ADVANCE='NO') (numbers(i),i=1,3)
Run Code Online (Sandbox Code Playgroud)
但是,我收到一条错误消息:
"错误#6568:使用ADVANCE,SIZE或EOR说明符无效."
那么我应该如何编写它以使其正确?
谢谢.
什么是比较两个字符串说,正确的方法abc,并bcd根据字母顺序?是否有内置命令可以这样做?或者会>或.lt.做没有任何问题的工作?
如何让Mathematica导出/保存/写入具有适当Fortan77格式的文本文件,即72列和第六列的延续标记?
我正在使用Mathematica生成大而复杂的分析表达式,然后我需要将其插入到预先存在的Fortran77代码中.我把一切都在数学的前端与正常工作FortranForm[]和
SetOptions[$Output, PageWidth -> 72]
但是,我无法弄清楚如何让Mathematica正确输出到文本文件.我想要这样的东西:
MM11 = mH1**2 + (g2**2*v1**2)/2. -
- (g2**2*(v1**2/2. -
- ((v2*Cos(phi2) - (0,1)*v2*Sin(phi2))*
- (v2*Cos(phi2) + (0,1)*v2*Sin(phi2)))/2.))/2.
...
Run Code Online (Sandbox Code Playgroud)
但得到这个:
MM11 = FortranForm[mH1^2 + (g2^2*v1^2)/2 - ...
Run Code Online (Sandbox Code Playgroud)
或这个:
MM11 = mH1**2 + (g2**2*v1**2)/2. - (g2**2*
(v1**2/2. - ((v2*Cos(phi2) - (0,1)*v2*Sin(phi2))*
...
Run Code Online (Sandbox Code Playgroud) 今天我正在阅读FORTRAN 77中编写的一些非常流行的数字库中的代码,例如QUADPACK(最近更新于1987年),我想知道是否有任何理由不在Fortran 90中重写这些库,除了大量工作之外鉴于Fortran 90为语言带来了巨大的改进,包括自由形式的源代码,更好的控制结构,因此可以忘记GO TO,矢量化,接口等等.
是因为FORTRAN 77编译器生成更优化的代码,也许它更适合并行执行?请注意,我甚至没有谈论Fortran 2003,这只有 8年的历史:我在谈论Fortran 90,所以我认为它已经足够广泛并且编译器已经准备好了.无论如何,我没有与业界联系.
编辑:janneb是对的:LAPACK实际上是用Fortran 90编写的.