小编use*_*915的帖子

numpy怎么能比我的Fortran例程快得多?

我得到一个512 ^ 3数组,表示模拟的温度分布(用Fortran编写).该数组存储在大小约为1/2G的二进制文件中.我需要知道这个数组的最小值,最大值和平均值,因为我很快就需要了解Fortran代码,我决定试一试,并提出了以下非常简单的例程.

  integer gridsize,unit,j
  real mini,maxi
  double precision mean

  gridsize=512
  unit=40
  open(unit=unit,file='T.out',status='old',access='stream',&
       form='unformatted',action='read')
  read(unit=unit) tmp
  mini=tmp
  maxi=tmp
  mean=tmp
  do j=2,gridsize**3
      read(unit=unit) tmp
      if(tmp>maxi)then
          maxi=tmp
      elseif(tmp<mini)then
          mini=tmp
      end if
      mean=mean+tmp
  end do
  mean=mean/gridsize**3
  close(unit=unit)
Run Code Online (Sandbox Code Playgroud)

在我使用的机器上,每个文件大约需要25秒.这让我觉得很长,所以我继续在Python中做了以下事情:

    import numpy

    mmap=numpy.memmap('T.out',dtype='float32',mode='r',offset=4,\
                                  shape=(512,512,512),order='F')
    mini=numpy.amin(mmap)
    maxi=numpy.amax(mmap)
    mean=numpy.mean(mmap)
Run Code Online (Sandbox Code Playgroud)

现在,我预计这会更快,但我真的被吹走了.在相同条件下只需不到一秒钟.平均值偏离我的Fortran例程发现的那个(我也使用128位浮点运行,所以我不知何故更多地信任它),但仅限于第7位有效数字左右.

numpy怎么这么快?我的意思是你必须查看数组的每个条目才能找到这些值,对吧?我在Fortran程序中做了一件非常愚蠢的事情,因为它花了这么长时间吗?

编辑:

要回答评论中的问题:

  • 是的,我也使用32位和64位浮点运行Fortran例程,但它对性能没有影响.
  • 我用过iso_fortran_env它提供128位浮点数.
  • 使用32位浮点数我的意思是相当多,所以精度确实是一个问题.
  • 我以不同的顺序在不同的文件上运行这两个例程,所以缓存在比较中应该是公平的吗?
  • 我实际上试过打开MP,但同时从不同位置的文件中读取.阅读完你的评论和答案后,这听起来真的很愚蠢,它使常规也需要更长的时间.我可能试一试数组操作,但也许甚至不需要.
  • 文件实际上是1/2G大小,这是一个错字,谢谢.
  • 我现在将尝试数组实现.

编辑2:

我实现了@Alexander Vogt和@casey在他们的答案中提出的建议,它的速度一样快,numpy但现在我有一个精确的问题,因为@Luaan指出我可能会得到.使用32位浮点数组,计算出的平均值sum为20%.干

...
real,allocatable :: tmp (:,:,:)
double precision,allocatable :: tmp2(:,:,:)
...
tmp2=tmp
mean=sum(tmp2)/size(tmp)
...
Run Code Online (Sandbox Code Playgroud)

解决了这个问题但增加了计算时间(不是很多,但显着).有没有更好的方法来解决这个问题?我找不到从文件中直接读单打的方法.怎么numpy避免这个?

感谢目前为止所有的帮助.

python arrays performance fortran numpy

81
推荐指数
2
解决办法
9375
查看次数

Matplotlib:其bbox中的中心文本

我必须绘制一些数据和一些垂直线来划定有趣的间隔,然后我想添加一些标签text.我不能完全避免标签与数据或垂直线重叠,所以我决定bbox在文本周围放置以保持可读性.我的问题是我无法在此框中集中对齐它,这在我看来是清晰可见的并且非常烦人.

我正在做这样的事情:

import numpy
import matplotlib
import matplotlib.pyplot as plt

fig=plt.figure()
plot=fig.add_subplot(111)
x=numpy.linspace(1,10,50)
y=numpy.random.random(50)
plot.plot(x,y)
plot.text(4.5,.5,'TEST TEST',\
          bbox={'facecolor':'white','alpha':1,'edgecolor':'none','pad':1})
plot.axvline(5,color='k',linestyle='solid')
plt.show()
Run Code Online (Sandbox Code Playgroud)

这创建了以下图: 在此输入图像描述

很明显,文本并不以其为中心bbox.我怎么能改变这个?我花了很长时间在Google上,但我找不到任何东西.

编辑:

感谢您的建议到目前为止.

表明我所看到的实际上是所希望的行为.显然bbox,新版本的matplotlib选择考虑了它所包含的文本可能的最大下降('g'的下降).

当文本中出现"g"时,这确实看起来很好: 在此输入图像描述 不幸的是,在我的情况下,没有'g'或任何类似下降的东西.有没有人有任何进一步的想法?

python matplotlib

7
推荐指数
2
解决办法
4262
查看次数

标签 统计

python ×2

arrays ×1

fortran ×1

matplotlib ×1

numpy ×1

performance ×1