列表和迭代器之间的可能差异

时间:2019-01-11 08:38:52

标签: python list generator

我对迭代器有一个奇怪的问题,我不知道。我有一个复杂的数字例程,返回一个生成器对象(或在对代码进行一些更改之后,islice)。然后,我检查结果,因为我知道结果必须具有负的虚部:

import numpy as np
threshold = 1e-8  # just check up to some numerical accuracy

results = result_generator(**inputs)
is_valid = [np.all(_result.imag < threshold) for _result in results]
print("Number of valid results: ", is_valid.count(True))

(很抱歉没有提供可执行代码,但目前我无法提供简单的代码。) 现在的问题是,这将返回一个有效的解决方案。如果我将代码更改为

import numpy as np
threshold = 1e-8  # just check up to some numerical accuracy

results = list(result_generator(**inputs))
is_valid = [np.all(_result.imag < threshold) for _result in results]
print("Number of valid results: ", is_valid.count(True))

使用列表而不是生成器,得到的有效解决方案为零。但是,我无法解决所有不同之处,因此不知道如何调试问题。 如果我通过调试器并打印出带有相应索引的结果,则结果甚至会不同,其中一个生成器是正确的,该列表之一是错误的。


这里是数值函数:

def result_generator(z, iw, coeff, n_min, n_max):
    assert n_min >= 1
    assert n_min < n_max
    if n_min % 2:
        # index must be even
        n_min += 1

    id1 = np.ones_like(z, dtype=complex)
    A0, A1 = 0.*id1, coeff[0]*id1
    A2 = coeff[0] * id1
    B2 = 1. * id1

    multiplier = np.subtract.outer(z, iw[:-1])*coeff[1:]
    multiplier = np.moveaxis(multiplier, -1, 0).copy()

    def _iteration(multiplier_im):
        multiplier_im = multiplier_im/B2
        A2[:] = A1 + multiplier_im*A0
        B2[:] = 1. + multiplier_im

        A0[:] = A1
        A1[:] = A2 / B2
        return A1

    complete_iterations = (_iteration(multiplier_im) for multiplier_im in multiplier)
    return islice(complete_iterations, n_min, n_max, 2)

1 个答案:

答案 0 :(得分:2)

您将一遍又一遍地产生相同的数组,而不是制作新的数组。调用list时,您将获得对同一数组的引用列表,并且该数组处于其最终状态。当您不调用list时,您会在每次生成时都以生成器生成它的状态检查数组。

停止重复使用同一阵列。