当前位置: 首页 > 面试题库 >

需要一种快速的方法来单次计算和求和一个迭代

朱海超
2023-03-14
问题内容

谁能帮我?我正在尝试提出一种计算方法

>>> sum_widths = sum(col.width for col in cols if not col.hide)

并计算此总和中的项目数,而不必进行两次以上的传递cols

似乎令人难以置信,但是在扫描了std-
lib(内置函数,itertools,functools等)后,我什至找不到一个可以计算可迭代对象数的函数。我发现了这个函数itertools.count,听起来像我想要的,但实际上它只是一个虚假命名的range函数。

经过一番思考,我想出了以下内容(它很简单,缺少库函数可能是可以原谅的,除了它的晦涩):

>>> visable_col_count = sum(col is col for col in cols if not col.hide)

但是,使用这两个函数需要两次迭代,这给我带来了错误的认识。

作为替代,以下功能可以实现我想要的功能:

>>> def count_and_sum(iter):
>>>     count = sum = 0
>>>     for item in iter:
>>>         count += 1
>>>         sum += item
>>>     return count, sum

问题在于,它花费的时间timeit是生成器表达式形式之和的100倍(根据)。

如果有人能拿出一个简单的单行代码满足我的要求,请告诉我(使用Python 3.3)。

编辑1

伙计们,这里有很多很棒的主意。感谢所有答复。我将花一些时间来消化所有这些答案,但是我将并且我将尝试选择一个进行检查。

编辑2

我对两个拙劣的建议(count_and_sum函数和2个单独的sum函数)重复了计时,并发现我原来的计时已过时,这可能是由于后台运行了自动计划的备份过程。

我还按时给出了答案中给出的大多数出色建议,所有建议都使用相同的模型。分析这些问题的答案一直是我相当的教育:新的用途dequeenumeratereduce与第一次countaccumulate。谢谢大家!

这是使用我开发的用于显示的软件的结果(来自我的慢速上网本):

┌───────────────────────────────────────────────────────┐
│                 Count and Sum Timing                  │
├──────────────────────────┬───────────┬────────────────┤
│          Method          │Time (usec)│Time (% of base)│
├──────────────────────────┼───────────┼────────────────┤
│count_and_sum (base)      │        7.2│            100%│
│Two sums                  │        7.5│            104%│
│deque enumerate accumulate│        7.3│            101%│
│max enumerate accumulate  │        7.3│            101%│
│reduce                    │        7.4│            103%│
│count sum                 │        7.3│            101%│
└──────────────────────────┴───────────┴────────────────┘

(我没有把复杂和折叠方法视作太模糊了,但还是要感谢。)

由于所有这些方法之间的时间差异很小,因此我决定使用该count_and_sum函数(带有显式for循环)作为最易读,显式和简单的函数(Python
Zen),并且它碰巧是最快的!

我希望我能接受这些令人惊奇的答案之一是正确的,但是尽管或多或少有些晦涩,但它们都同样好,所以我只是在投票给所有人,并接受我自己的答案是正确的(count_and_sum函数),因为这就是我使用的。

“应该有一种-最好只有一种-明显的方式来做到这一点”是什么意思?


问题答案:

感谢您提供所有出色的答案,但我决定使用原来的count_and_sum函数,如下所示:

>>> cc, cs = count_and_sum(c.width for c in cols if not c.hide)

正如我对原始问题的修改中所解释的那样,事实证明这是最快,最易读的解决方案。



 类似资料:
  • 例如,计算欧氏距离:。这里,如果或的大小太小/太大,则可能发生下溢/溢出。 解决这一问题的常用方法是用最大的数量级除数。但是,这个解决方案是: 慢(除法慢) 导致一点额外的不准确 所以我想,不除以最大的星等数,让我们把它乘以一个接近的-2的倒数数。这似乎是一个更好的解决办法,因为: 乘法比除法快得多 精度更高,因为乘以2的幂数是精确的 此函数应返回一个规范化的和,两者都是2的幂数,其中接近于,而是

  • 我正在寻找一个快速的算法: 我有一个大小为n的int数组,目标是在数组中找到所有模式, 例如,我知道有一个大小为3的int数组是,那么只有一种可能性:12=3(考虑12=21) 我正在考虑实现对和Hashmap来使算法快速。(我现在得到的最快的仍然是 请分享你对这个问题的看法,谢谢

  • 我想计算一个二次型:in Julia 在这些情况下,最有效的计算方法是什么: 没有假设 是对称的 和是相同的() 和都是对称的 我知道朱莉娅有。但是我想知道它是否比BLAS呼叫更快。

  • 问题内容: 我正在开发Midlet应用程序。我发现自己经常需要缩放图像。这已经成为一个问题,因为某些电话速度很慢,缩放时间太长。 目前,我正在使用Image.createRGBImage(int,int,int,boolean)缩放图像。 我想知道你们中是否有人知道一种非常有效和快速的缩放图像的方法。 注意: 这是一个Midlet应用程序,因此仅JavaME可用,这意味着我无权访问完整Java版本

  • 我有一个小的基本问题。我用的是Mac电脑,我以前在办公室工作。py文件与升华3。我喜欢的一件事是,当Sublime关闭时,对于文件夹中的给定文件——如果我在寻找一些代码——我可以点击空格键,Mac电脑可以快速预览文件。py文件。 现在我在Jupyter笔记本中工作,并将所有内容保存为. ipynb文件。现在我不能点击空格键和浏览文件——我从命令区启动JN,它要慢得多。 我怀疑有更快的方法在浏览器窗