Python 算法挑战?

标签 python algorithm

我有一个 python 函数(称之为 myFunction),它作为输入 一个数字列表,并且经过复杂的计算,返回计算结果(数字)。

函数如下所示:

def myFunction( listNumbers ):
    # initialize the result of the calculation
    calcResult = 0

    # looping through all indices, from 0 to the last one
    for i in xrange(0, len(listNumbers), 1):
        # some complex calculation goes here, changing the value of 'calcResult'

    # let us now return the result of the calculation
    return calcResult

我测试了该功能,它按预期工作。

通常,myFunction 会提供一个 listNumbers 参数,其中包含 5,000,000 个元素。如您所料,计算需要时间。我需要这个函数尽可能快地运行

挑战来了:假设现在是凌晨 5 点,listNumbers 中仅包含 4,999,999 个值。意思是,它的 LAST VALUE 尚未可用。此值将仅在早上 6 点可用

显然,我们可以执行以下操作(第一种模式):等到早上 6 点。然后,将最后一个值附加到 listNumbers 中,然后运行 ​​myFunction。这个解决方案有效,但是 myFunction 返回我们的计算结果之前需要一段时间(因为我们需要处理整个数字列表,从第一个元素)。请记住,我们的目标是在早上 6 点之后尽快获得结果

我在想一个更有效的方法来解决这个问题(第二模式):因为(早上 5 点)我们有 listNumbers 4,999,999值,让我们立即开始运行 myFunction。让我们尽我们所能(记住,我们还没有最后一条数据),然后——恰好在早上 6 点——“插入”新数据——并生成计算结果。这应该快得多,因为大部分处理将在早上 6 点之前完成,因此,我们只需要处理新数据——这意味着计算结果应该立即可用早上 6 点之后

假设我们没有办法检查myFunction 的代码或修改它。是否有任何编程技术/设计理念可以让我们采用myFunction原样,并用它做一些事情(不改变它的代码)以便我们可以让它在第二模式下运行,而不是第一模式

请不要建议使用c++/numpy + cython/并行计算等方式来解决这个问题。此处的目标是查看是否有任何编程技术设计模式 可以轻松用于解决此类问题。

最佳答案

你可以使用 generator作为输入。生成器只会在有数据可供处理时返回。

更新:感谢精彩评论,我想删除此条目:)

class lazylist(object):
    def __init__(self):
        self.cnt = 0
        self.length = 5000000

    def __iter__(self):
        return self

    def __len__(self):
        return self.length

    def next(self):
        if self.cnt < self.length:
            self.cnt += 1
            #return data here or wait for it
            return self.cnt #just return a counter for this example
        else:
            raise StopIteration()

    def __getitem__(self, i):
        #again, block till you have data.
        return i+1 #simple counter

myFunction(lazylist())

更新:正如您从评论和其他解决方案中看到的那样,您的循环构造和 len 调用会引起很多麻烦,如果您可以消除它,您可以使用更优雅的解决方案。 for e in lienumerate 是 pythonic 方式。

关于Python 算法挑战?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6769315/

相关文章:

algorithm - 创建多个组合,总和为 100

python - 动态使用 Cython 扩展模块中定义的类方法

python - 将 3D 数组除以 2D 行总和?

python - Windows Phone 是否支持脚本?

python - 如何将 timedelta 转换为 Pandas 中的时间?

performance - 我们如何通过串联数组中的整数有效地找到最小整数?

c++ - 第二次在图上运行时,广度/深度优先搜索会导致崩溃

algorithm - 单连通图中的特例

algorithm - 如何检测请求/秒速率的增加?

python - 在 ipython 中 latex 打印继承的 sympy 类时行为不一致