Python,提高循环性能

Python,提高循环性能,python,performance,dictionary,for-loop,Python,Performance,Dictionary,For Loop,我创建了一个名为localSun的类。我已经建立了一个简化的地球-太阳系统模型,并试图计算出地球上任何时间任何位置的太阳高度角。当我为当前时间运行代码并检查timeandddate时,它匹配得很好。所以它起作用了 但是我想用一年的时间把所有的高度角存储到一个特定位置的数组(numpy数组)中,我每隔1分钟去一次 这是我第一次天真的尝试,我相当肯定这对性能不好。我只是想测试一下性能 import numpy as np from datetime import datetime from date

我创建了一个名为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
altitudes是我想要存储所有高度的数组,它的大小是525969,基本上是一年中的分钟数

localSun()对象接受3个参数:colatitude(30度)、longitude(0度)和datetime对象,该对象的时间是一个多小时前的时间(发布时)

所以问题是:什么是一种很有效的方法,以1分钟的间隔度过一年,然后计算当时的高度角,因为这看起来相当慢。我应该使用map来更新高度角的值,而不是for循环。我想我每次也必须创建一个新的localSun对象。而且,一直只创建这些变量n和nn可能是不好的

我们可以假设localSun对象所有方法都工作正常。我只是想问一下,以1分钟的间隔度过一年,并根据海拔高度更新阵列的有效方法是什么(如果有的话)。我的代码应该能透露足够的信息

我甚至想在1秒钟的时间间隔内完成这项工作,所以如果有一个有效的方法,那就太好了。我试过了,但是如果我使用这个代码,需要很长时间

这段代码花了大约一分钟在一台大学计算机上完成,据我所知,这台计算机相当快


如果有人能回答,我会非常感激。提前谢谢

既然您已经在使用
numpy
,您可以进一步使用。它具有强大的日期和时间操作例程,例如:

然后,您需要调整您的
localSun
以使用一个数组,而不是单个
datetime.datetime


从分钟更改为秒将非常简单,只需将
freq='min'
更改为
freq='S'
Numpy具有naitive
datetime
timedelta
,因此您可以采取如下方法:

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)

一点也不快,但直到您可以修改“LoalSun”来处理DATESTIME数组。< /P>如果这是工作代码,请考虑将其张贴到。既然你已经使用了NUMPY,那么那边的家伙们会很高兴的,那么把日期存储在一个麻木数组中,这样循环就可以被矢量化了。我会考虑从LeN(海拔)中做一个常量/变量,这会在迭代过程中稍微提高性能。尽管如此,为什么不在enumerate(altitudes)中为i,j提供索引和高度值呢,因此,这基本上取决于

localSun
是否能够接受并返回一个日期时间数组,而不仅仅是一个值。我认为这在很大程度上取决于
SolarSun
的实际功能。如果您可以使它与日期时间数组一起工作,那么您可以将for循环矢量化。仅仅用你共享的代码很难说更多,你不需要一个完全不同的库。numpy可以很好地处理日期范围。在我们了解更多关于localSun的信息之前,您的回答并没有真正添加任何有用的内容。
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)