Python,改进了循环性能

时间:2018-05-29 13:47:41

标签: python performance dictionary for-loop

我创建了一个名为localSun的类。我采用了地球 - 太阳系统的简化模型,并试图随时计算地球上任何位置的太阳高度角。当我运行当前时间的代码并检查时间和日期时它匹配得很好。所以它有效。

但是我想基本上经过一年的时间将所有高度角存储到一个特定位置的阵列(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度),经度(0度)和一个日期时间对象,它有一个多小时前的时间(发布时)

所以问题是:在1分钟的时间间隔内完成一年并计算当时的高度角是多么有效的方法,因为这似乎相当缓慢。我应该使用map来更新高度角的值而不是for循环。我认为我每次都必须创建一个新的localSun对象。另外,一直创建这些变量n和nn可能很糟糕。

我们可以假设localSun对象的所有方法都可以正常工作。我只是问一个有效的方法(如果有的话)以1分钟为间隔进行一年并用高度更新数组。我的代码应该显示足够的信息。

我希望甚至可能在1秒后的间隔内做到这一点,所以知道是否有一种有效的方法会很棒。我试过了,但如果我使用这段代码需要很长时间。

这段代码在大学的计算机上用了大约一分钟的时间,据我所知,它的速度非常快。

如果有人可以回答,那就非常了解情况。提前谢谢!

2 个答案:

答案 0 :(得分:0)

Numpy有敏感的datetimetimedelta support,所以你可以这样做:

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'以使用日期时间数组之前,这一点有效。

答案 1 :(得分:-2)

由于您已经在使用numpy,因此可以使用pandas更进一步。它具有强大的日期和时间操作例程,例如pd.date_range

import pandas as pd


start = pd.Timestamp(year=2018, month=1, day=1)
stop = pd.Timestamp(year=2018, month=12, day=31)
dates = pd.date_range(start, stop, freq='min')
altitudes = localSun(30, 0, dates)

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

从分钟更改为秒,就像将freq='min'更改为freq='S'一样简单。