Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Python-生成器、迭代器和速度_Python 2.7_Generator - Fatal编程技术网

Python 2.7 Python-生成器、迭代器和速度

Python 2.7 Python-生成器、迭代器和速度,python-2.7,generator,Python 2.7,Generator,[编辑以反映到目前为止的评论和我的进一步阅读。] 问:我不明白为什么下面三个版本的eta函数都是用python编写的,速度都差不多,即“绑定”中的线性函数,并且具有相似的常数 作为一个背景:我需要一个相当快速的eta函数版本来进行计算。可以找到eta函数的定义。在给出这三个函数之前,我们需要一个简单的辅助函数 def chi(n): # Dirichlet character n =

[编辑以反映到目前为止的评论和我的进一步阅读。]

问:我不明白为什么下面三个版本的eta函数都是用python编写的,速度都差不多,即“绑定”中的线性函数,并且具有相似的常数

作为一个背景:我需要一个相当快速的eta函数版本来进行计算。可以找到eta函数的定义。在给出这三个函数之前,我们需要一个简单的辅助函数

def chi(n): # Dirichlet character                                                     
    n = n%12
    if n == 1 or n == 11:
        return 1
    if n == 5 or n == 7:
        return -1
    return 0
现在这三个版本让我感到困惑。首先,我们有明显的一条线性,直接来自于用雅可比θ函数定义的eta

def eta_Dedekind_theta(tau, bound = 50):
    assert tau.imag > 0
    r = Exp(Pi*I*tau/12)
    # sum_1^infty chi(n) r^(n^2)                                                      
    return sum([chi(n)*r**(n**2) for n in range(1,bound+1)])
其次,我们对单行程序进行了明显的修改:用生成器表达式替换列表理解

def eta_Dedekind_theta_round(tau, bound = 50):
    assert tau.imag > 0
    r = Exp(Pi*I*tau/12)
    # sum_1^infty chi(n) r^(n^2)                                                      
    return sum((chi(n)*r**(n**2) for n in range(1,bound+1)))
但是这个版本会稍微慢一点-为什么用生成器替换列表理解会减慢速度?最后,这里是我首先编写的版本。我认为这是非常聪明的,因为它避免了二次大指数的幂运算

def eta_Dedekind_theta_clever(tau, bound = 50):
    assert tau.imag > 0
    r = Exp(Pi*I*tau/12)
    r2 = r**2
    lin = 1
    quad = r
    sum = 0
    # sum_1^infty chi(n) r^(n^2)                                                      
    for n in range(1, bound+1):
        sum = sum + chi(n)*quad # n^2                                                 
        lin = lin*r2 # 2n                                                             
        quad = quad*lin*r # n^2 + 2n + 1 = (n+1)^2                                    
    return sum

事实上,这个版本比之前的两个版本都要稍微快一点。但我认为这将是线性的,而由于指数运算的成本,一行程序将非常慢。但事实并非如此:计时显示,它们都是线性的,具有大致相似的常数。我想我不理解python中操作的成本

请在ipython中包含计时代码…在ipython中,我设置tau=1j,然后对每个函数运行1000次迭代,边界从100增加到700,以100为步长。下面是计时函数--def repeat(func,arg,bound,times):对于范围内的I(times):a=func(arg,bound=bound)您不是在“将生成器变成元组”--parens()中的生成器实际上是一个生成器表达式,而括号[]中的a表示列表理解。根据文档,生成器对内存更友好,但可能因此速度较慢?好吧,我开始阅读PEP 202和289-我猜我测试的大小不够大,无法实现生成器表达式的“精确性”。我还花了一些时间研究python源代码中complexobject.c文件中的函数c_pow。因此python以一种相当简单的方式处理复杂的求幂运算。特别是,上述三个函数在浮点数上的操作数似乎都是线性的。所以