Python 替换为循环?此函数可以工作,但需要很长时间。I';我在寻找方法来改善它

Python 替换为循环?此函数可以工作,但需要很长时间。I';我在寻找方法来改善它,python,python-3.x,numpy,dataframe,Python,Python 3.x,Numpy,Dataframe,它工作,但需要40秒的工作1股票1简单的移动平均线。我是一个初学者,有没有什么方法可以取代那些for循环或者更有效的方法来运行它?我正在读有关numpy的书,但我不明白它如何能取代循环 我试图制作一个csv来存储从当前期间到数据帧开始的所有指示符值。 我目前只有一条移动平均线,但以这样的速度,再加上其他任何东西都是毫无意义的:) 试试这个: import numpy as np from functools import reduce def runcheck(df,adress):

它工作,但需要40秒的工作1股票1简单的移动平均线。我是一个初学者,有没有什么方法可以取代那些for循环或者更有效的方法来运行它?我正在读有关numpy的书,但我不明白它如何能取代循环

我试图制作一个csv来存储从当前期间到数据帧开始的所有指示符值。 我目前只有一条移动平均线,但以这样的速度,再加上其他任何东西都是毫无意义的:)

试试这个:

import numpy as np
from functools import reduce


def runcheck(df,adress):
    startT = time.time()

    rad_data = map(lambda i: reduce(lambda x, y: x + y, map(lambda z: df.iloc[z, 5], np.arange(i-445, i)))/445, np.arange(445, len(df.index)))

    '''
    Explanation

    list_1 = np.arange(445, len(def.index) -> Create a list of integers from 445 to len(def.index)
    rad_data = map(lambda i: function, list_1) -> Apply function (see below) to each value (i) in the generated list_1
    function = reduce(lambda x, y: x + y, list_2)/445 -> Take 2 consecutive values (x, y) in list_2 (see below) and sum them, repeat until one value left (i.e. sum of list_2), then divide by 445
    list_2 = map(lambda z: df.iloc[z, 5], list_3) -> Map each value (z) in list_3 (see below) to df.iloc[z, 5]
    list_3 = np.arange(i-445, i) -> Create a list of integers from i-445 to i (value i from list_1)
    '''
    # writing to your csv file outside the loop once you have all the values is better, as you remove the overhead of re-opening the file each time
    with open(adress, "a") as fp: 
        wr = csv.writer(fp,)
        for data in rad_data:
            wr.writerow([data])

    print('Time was :', time.time()-startT)
    stop=input('')
不确定它是否有效,因为我没有样本数据。如果有错误,请告诉我,我将尝试调试

试试这个:

import numpy as np
from functools import reduce


def runcheck(df,adress):
    startT = time.time()

    rad_data = map(lambda i: reduce(lambda x, y: x + y, map(lambda z: df.iloc[z, 5], np.arange(i-445, i)))/445, np.arange(445, len(df.index)))

    '''
    Explanation

    list_1 = np.arange(445, len(def.index) -> Create a list of integers from 445 to len(def.index)
    rad_data = map(lambda i: function, list_1) -> Apply function (see below) to each value (i) in the generated list_1
    function = reduce(lambda x, y: x + y, list_2)/445 -> Take 2 consecutive values (x, y) in list_2 (see below) and sum them, repeat until one value left (i.e. sum of list_2), then divide by 445
    list_2 = map(lambda z: df.iloc[z, 5], list_3) -> Map each value (z) in list_3 (see below) to df.iloc[z, 5]
    list_3 = np.arange(i-445, i) -> Create a list of integers from i-445 to i (value i from list_1)
    '''
    # writing to your csv file outside the loop once you have all the values is better, as you remove the overhead of re-opening the file each time
    with open(adress, "a") as fp: 
        wr = csv.writer(fp,)
        for data in rad_data:
            wr.writerow([data])

    print('Time was :', time.time()-startT)
    stop=input('')

不确定它是否有效,因为我没有样本数据。如果有错误,请告诉我,我将尝试调试

您可以从删除对int()的调用开始。只需使用数字,它将节省大量的函数查找。好的,这绝对是一个问题谢谢大家的帮助:)Tiger我删除了你说的所有int调用。这很有帮助,但运行时间仍然超过40秒。我投票决定结束这个问题,因为这个问题对这个网站来说太广泛了@请看Akaisteph7,Numpy也使用“引擎盖下”的循环。不同之处在于,这些循环是在编译的C代码中,而不是在Python字节码中。这使他们更快。此外,对于某些操作,Numpy可以使用高度优化的科学库。只需使用数字,它将节省大量的函数查找。好的,这绝对是一个问题谢谢大家的帮助:)Tiger我删除了你说的所有int调用。这很有帮助,但运行时间仍然超过40秒。我投票决定结束这个问题,因为这个问题对这个网站来说太广泛了@请看Akaisteph7,Numpy也使用“引擎盖下”的循环。不同之处在于,这些循环是在编译的C代码中,而不是在Python字节码中。这使他们更快。此外,对于某些操作,Numpy可以使用高度优化的科学库。名称错误:从functools import reduce中未定义名称“reduce”
,从functools import reduce中导入reduce
?很抱歉,请问如何阅读此函数或了解其工作原理?我已进行编辑,请重试。我正在使用python的功能方面,这里介绍一些技术:NameError:未定义functools import reduce中的名称“reduce”
“reduce”
来自functools import reduce?很抱歉,请问我如何阅读此函数或了解其工作原理?我已进行了编辑,请重试。我正在使用python的功能方面,下面介绍一些技术: