有没有更简洁,有效或简单的pythonic方法来执行以下操作?
def product(list):
p = 1
for i in list:
p *= i
return p
编辑:
我实际上发现这比使用operator.mul快一点:
from operator import mul
# from functools import reduce # python3 compatibility
def with_lambda(list):
reduce(lambda x, y: x * y, list)
def without_lambda(list):
reduce(mul, list)
def forloop(list):
r = 1
for x in list:
r *= x
return r
import timeit
a = range(50)
b = range(1,50)#no zero
t = timeit.Timer("with_lambda(a)", "from __main__ import with_lambda,a")
print("with lambda:", t.timeit())
t = timeit.Timer("without_lambda(a)", "from __main__ import without_lambda,a")
print("without lambda:", t.timeit())
t = timeit.Timer("forloop(a)", "from __main__ import forloop,a")
print("for loop:", t.timeit())
t = timeit.Timer("with_lambda(b)", "from __main__ import with_lambda,b")
print("with lambda (no 0):", t.timeit())
t = timeit.Timer("without_lambda(b)", "from __main__ import without_lambda,b")
print("without lambda (no 0):", t.timeit())
t = timeit.Timer("forloop(b)", "from __main__ import forloop,b")
print("for loop (no 0):", t.timeit())
给我
('with lambda:', 17.755449056625366)
('without lambda:', 8.2084708213806152)
('for loop:', 7.4836349487304688)
('with lambda (no 0):', 22.570688009262085)
('without lambda (no 0):', 12.472226858139038)
('for loop (no 0):', 11.04065990447998)
不使用lambda:
from operator import mul
reduce(mul, list, 1)
更好,更快。使用python 2.7.5
from operator import mul
import numpy as np
import numexpr as ne
# from functools import reduce # python3 compatibility
a = range(1, 101)
%timeit reduce(lambda x, y: x * y, a) # (1)
%timeit reduce(mul, a) # (2)
%timeit np.prod(a) # (3)
%timeit ne.evaluate("prod(a)") # (4)
在以下配置中:
a = range(1, 101) # A
a = np.array(a) # B
a = np.arange(1, 1e4, dtype=int) #C
a = np.arange(1, 1e5, dtype=float) #D
python 2.7.5的结果
| 1 | 2 | 3 | 4 |
------- + ----------- + ----------- + ----------- + ------ ----- +
20.8 µs 13.3 µs 22.6 µs 39.6 µs
B 106 µs 95.3 µs 5.92 µs 26.1 µs
C 4.34毫秒3.51毫秒16.7微秒38.9微秒
D 46.6毫秒38.5毫秒180 µs 216 µs
结果:np.prod
如果np.array
用作数据结构,则速度最快(小型阵列为18x,大型阵列为250x)
使用python 3.3.2:
| 1 | 2 | 3 | 4 |
------- + ----------- + ----------- + ----------- + ------ ----- +
23.6 µs 12.3 µs 68.6 µs 84.9 µs
B 133 µs 107 µs 7.42 µs 27.5 µs
C 4.79毫秒3.74毫秒18.6微秒40.9微秒
D 48.4毫秒36.8毫秒187微秒214微秒
python 3更慢吗?
问题内容: 我正在阅读Lambda的状态:图书馆版,并对以下声明感到惊讶: 在 Streams 部分下,有以下内容: 该文件没有说明实际的内容,我也不知道它是否重要。 让我感到困惑的是:此代码块返回什么样的具体代码? 它将变量分配给,这是完全可以的。 也不决定要使用哪种列表。 均未指定的具体类型。 那么,这里使用的是什么 具体 类型(子类)?有保证吗? 问题答案: 那么,这里使用List的什么具体
web3.eth.getCompilers()方法返回可用编译器的列表。 调用: web3.eth.getCompilers([callback]) 参数: callback:Function - 可选的回调函数,其第一个参数为错误对象,第二个参数为结果。 返回值: 一个Promise对象,其解析值为可用编译器名称字符串数组。 示例代码: web3.eth.getCompilers() .the
问题内容: 让 假设我要对列表中每个列表的索引元素求和,例如在矩阵列中添加数字以获得单个列表。我假设数据中的所有列表的长度均相等。 如何遍历列表列表而不会出现索引超出范围错误?也许lambda?谢谢! 问题答案: 您可以尝试以下方法: 这里使用的组合和解压的列表,然后根据自己的索引压缩的项目。然后,您可以使用列表推导来遍历相似索引的组,对其进行求和并返回其“原始”位置。 为了更清楚一点,下面是迭代
我的客户希望在WooCommerce中的单个产品页面上放置一个“返回店铺”按钮,该按钮将返回到上一页,而不是主店铺页面。 我已经解释过,所有的浏览器都有后退按钮,但他们死心塌地地想要有这个按钮。我甚至提到激活面包屑,但他们也不喜欢。 我如何才能做到这一点。任何帮助都非常感谢。
问题内容: 我是Java的新手,我需要列出列表列表。我可以在python中做到这一点,因为列表的元素可以是列表,因此在嵌入式列表中将引用列表,并且将引用嵌入式列表的zeroeth元素。有什么简单的方法可以在Java中实现此行为? 问题答案: 所有其他答案在技术上都是正确的,但是恕我直言,如果您实施了粗略的列表列表,您将无法在正确的抽象级别上处理数据。例如,我很确定列表列表在您的业务领域中已经意味着
问题内容: 在Python IDLE 3.5.0 Shell中工作。根据我对内置“过滤器”功能的了解,它会根据您传递给它的内容返回列表,元组或字符串。因此,为什么下面的第一个分配有效,而第二个却不起作用(“ 只是交互式Python提示) 问题答案: 看看python文档(从此处开始): 从这些 iterable 元素构造一个迭代器,为其 功能 返回true。 因此,为了获取列表,您必须使用列表类: