Python,改进循环performan

2024-10-02 10:18:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在本地创建了一个sun类。我建立了一个简化的地-日系统模型,并试图计算出地球上任何地点在任何时间内太阳的高度角。当我运行当前时间的代码并检查timeanddate时,它匹配得很好。所以它起作用了。在

但后来我想用一年的时间,把所有的高度角存储到一个数组(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个参数:colatity(30 deg)、longitude(0 deg)和一个datetime对象,该对象的时间是一个多小时前的时间(当它被发布时)

所以问题是:怎样才能以1分钟的间隔计算一年的时间,计算出当时的高度角,因为这看起来相当慢。我应该用地图来更新高度角的值而不是for循环吗。我想我每次都必须创建一个新的localSun对象。另外,一直创建这些变量n和nn可能是不好的。在

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

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

这段代码在一台大学计算机上花了大约一分钟的时间,据我所知,这台计算机的速度相当快。在

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


Tags: 对象方法代码fromimportnumpydatetime间隔
2条回答

Numpy有naitive datetimetimedeltasupport,因此您可以采用如下方法:

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'以使用日期时间数组之前,它可以正常工作。在

因为您已经在使用numpy,所以您可以使用^{}进一步。它具有强大的日期和时间操作例程,如^{}

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来处理^{}的数组,而不是单个的datetime.datetime。在

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

相关问题 更多 >

    热门问题