首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何摆脱Python代码中嵌套的for循环?

如何摆脱Python代码中嵌套的for循环?
EN

Stack Overflow用户
提问于 2018-06-21 03:10:07
回答 4查看 1.5K关注 0票数 4

我有一年的卫星测量电子(仪器每4秒测量一次)。这种阵列被称为“电子”。我也有相应的datetime.datetime格式的时间(称为'time')。我想要平均电子数组,以获得每分钟的平均值,而不是每4秒。我想把它们放在一个新的数组'g‘中。然而,当我编写循环时,它变得非常慢。有没有办法让它更快?下面是我要做的:

import numpy as np
import spacepy.time as spt
import datetime as dt

year=2001
for month in range (1,13):
        dmax=np.array([[31,28,31,30,31,30,31,31,30,31,30,31]]).T #number of days in a month
        for day in range(1,dmax[month-1]+1):
            for hour in range(24):
                for minute in range(60):

                D1=spt.Ticktock(dt.datetime(year, month, day, hour, minute, 0,0),'UTC').RDT #lower boundary of a minute

#here, spt is a spacepy.time, and '.RDT' returns GREGORIAN ORDINAL TIME.

                D2=spt.Ticktock(dt.datetime(year, month, day, hour, minute, 59,999999),'UTC').RDT #upper boundary of a minute

                mask=((time>D1)&(time<D2))

                electrons_logic=electrons[mask]
                k=(month-1)*dmax[month-1]*24*60+(day-1)*24*60+hour*60+(minute+1) #number of the minute in a year
                g[k,0]=np.nanmean(electrons_logic)

有没有一种方法可以避免嵌套循环并使其更快?

也许有一种方法可以使用多处理/并行计算来使其更快?

EN

回答 4

Stack Overflow用户

发布于 2018-06-21 04:07:35

每当你有关于迭代的问题时,想想itertools

from itertools import product

dmax=np.array([[31,28,31,30,31,30,31,31,30,31,30,31]]).T
for month in range (1,13):
    for day, hour, minute in product(range(1,dmax[month-1]+1), range(24), range(60)):
        ...

我还建议在循环之外定义dmax,否则它将在每次month迭代时被实例化。

票数 3
EN

Stack Overflow用户

发布于 2018-06-21 03:44:17

另一种方法(至少对于3个内部循环)是循环分钟数,然后使用division+remainder计算小时和天:

dmax=np.array([[31,28,31,30,31,30,31,31,30,31,30,31]]).T #number of days in a month
for month in range (1,13):
    nb_days = dmax[month-1]
    for m in range(60*24*nb_days):
        hour,minute = divmod(m,60)
        day,hour = divmod(hour,nb_days)
        day += 1

这是在每次迭代中使用2个除法/模(使用divmod函数可以一次完成)与2个循环之间的权衡。由于python循环的开销很大,因此值得一试。

票数 1
EN

Stack Overflow用户

发布于 2018-06-21 03:43:58

如果有任何静态初始化(针对您的代码)

dmax=np.array([[31,28,31,30,31,30,31,31,30,31,30,31]]).T #number of days in a month

它应该在for循环之外。因为,每次循环运行时,该数组都会被初始化那么多次计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50955427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档