我做了一个叫做localSun的类。我用了一个地球太阳系的简化模型,试图计算出地球上任何一个位置的太阳在任何时间的高度角。当我运行当前时间的代码并检查timeandddate时,它匹配得很好。所以有效。
但后来我想基本上经过一年,把所有的高度角存储到一个特定位置的数组(numpy数组)中,每隔1分钟我就去一次。
这是我第一次天真的尝试,我敢肯定这不利于我的表现。我只是想测试一下性能。

import numpy as np
from datetime import datetime
from datetime import date
from datetime import timedelta
...

...
altitudes = np.zeros(int(year/60))

m = datetime(2018, 5, 29, 15, 21, 0)
for i in range(0, len(altitudes)):
    n = m + timedelta(minutes = i+1)
    nn = localSun(30, 0, n)

    altitudes[i] = nn.altitude() # .altitude() is a method in localSun

高度是我想要存储所有高度的数组,它的大小是525969,基本上是一年中的分钟数。
localSun()对象有3个参数:colatitude(30 deg)、longitude(0 deg)和datetime对象,后者的时间是一个多小时前(当发布时)的时间
所以问题是:在1分钟的时间间隔内计算一年的高度角是一个很有效的方法,因为这个方法看起来很慢。我是否应该使用map来更新高度角的值,而不是for循环。我想每次创建一个新的localSun对象时也必须这样做。另外,一直创建这些变量n和nn可能也不好。
我们可以假设localSun对象所有方法都工作正常。我只是想问一个有效的方法(如果有的话)是以1分钟的间隔通过一年,并根据海拔高度更新阵列。我的代码应该能显示足够的信息。
我甚至想在一秒钟后做这个,所以很高兴知道是否有一个有效的方法。我试过了,但是如果我用这个代码的话需要很长时间。
这段代码在一台大学电脑上花了大约一分钟的时间,据我所知,这台电脑的速度相当快。
如果有人能回答,我会非常感激。提前谢谢!

最佳答案

Numpy有naitivedatetimetimedeltasupport这样的方法:

start = datetime.datetime(2018,5,29,15,21,0)
end = datetime.datetime(2019,5,29,15,21,0)
n = np.arange(start, end, dtype='datetime64[m]') # [m] specifies the interval as minutes
altitudes = np.vectorize(lambda x, y, z: localSun(x, y, z).altitude())(30,0,n)

np.vectorize一点也不快,但在您可以修改“localSun”以使用日期时间数组之前,它可以正常工作。

07-26 05:56