Python,提高循环性能

标签 python performance dictionary for-loop

我创建了一个名为 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 度)、经度(0 度)和一个 datetime 对象,该对象具有一个多小时前的时间(发布时)

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

我们可以假设 localSun 对象的所有方法都工作正常。我只是问什么是一种有效的方法(如果有的话)以 1 分钟的间隔经历一年并用海拔高度更新数组。我拥有的代码应该可以揭示足够的信息。

我什至想在 1 秒的时间间隔内执行此操作,所以很高兴知道是否有有效的方法。我试过了,但如果我使用这段代码,它会花费很长时间。

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

如果有人能回答,将不胜感激。提前致谢!

最佳答案

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

关于Python,提高循环性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50586007/

相关文章:

python - PyObject_CallMethod有时在调用python方法时出现段错误

python - 在Python中,单 channel 图像的形状是一个问题

javascript - 更好的搜索算法来提高性能?

mysql - 什么时候使用多重索引?何时使用力量指数?

mysql - 我应该将值存储在数据库中还是 XML 或文本文件中?

sql - 如何在 Azure SQL 数据库中存储字典? ( swift )

python - 如何在GAE中的ndb模型中创建随机默认值?

python - 等待外部程序完成写入文件

PHP 双向 map

python - 从/使用函数参数作为键和默认值作为值创建字典