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