我最近在一个姐妹网站上回答了一个问题,该问题要求一种功能来计算数字的所有偶数位。其中的其他的答案中包含两个功能(这被证明是最快的,至今):
def count_even_digits_spyr03_for(n):
count = 0
for c in str(n):
if c in "02468":
count += 1
return count
def count_even_digits_spyr03_sum(n):
return sum(c in "02468" for c in str(n))
Run Code Online (Sandbox Code Playgroud)
另外,我还研究了使用列表理解和list.count
:
def count_even_digits_spyr03_list(n):
return [c in "02468" for c in str(n)].count(True)
Run Code Online (Sandbox Code Playgroud)
前两个函数基本相同,除了第一个函数使用显式的计数循环,而第二个函数使用内建的sum
。我本来希望第二个更快(基于此答案),这是我建议将第二个变成要求审查的东西。但是,事实证明是相反的。用一些数字递增的随机数对其进行测试(因此,任何一位数字的偶数概率约为50%),我得到以下计时:
为什么手动for
循环这么快?比使用快将近两倍sum
。而且由于内置功能sum
应该比手动汇总列表大约快五倍(根据链接的答案),这意味着它实际上要快十倍!是否因为只需要将一半的值添加到计数器而节省了费用,因为另一半被丢弃了,足以说明这种差异?
使用if
像这样的过滤器:
def count_even_digits_spyr03_sum2(n):
return sum(1 for c in str(n) if c in "02468") …
Run Code Online (Sandbox Code Playgroud) 该包joblib
有一个函数delayed
,它捕获传递给该函数的参数。它可以像这样使用:
from joblib import delayed
def f(n):
return n**2
delayed(f)(2)
# (<function f at 0x7f939eb3fe60>, (2,), {})
h = delayed(f)
h(2)
# (<function f at 0x7f939eb3fe60>, (2,), {})
Run Code Online (Sandbox Code Playgroud)
后一种用法让我认为它可以像任何其他装饰器一样使用。它的文档支持这一点:
joblib.delayed(函数, check_pickle=True)
装饰器用于捕获函数的参数。
但是,这失败了:
from joblib import delayed
@delayed
def g(n):
return n**2
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "/usr/lib/python2.7/dist-packages/joblib/parallel.py", line 158, in delayed
# pickle.dumps(function)
# File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
# raise TypeError, …
Run Code Online (Sandbox Code Playgroud) python中的循环花了很多时间给出结果.这包含大约100k记录.
这需要很多时间.时间如何减少
df['loan_agr'] = df['loan_agr'].astype(int)
for i in range(len(df)):
if df.loc[i,'order_mt']== df.loc[i,'enr_mt']:
df['new_N_Loan'] = 1
df['exist_N_Loan'] = 0
df['new_V_Loan'] = df['loan_agr']
df['exist_V_Loan'] = 0
else:
df['new_N_Loan'] = 0
df['exist_N_Loan'] = 1
df['new_V_Loan'] = 0
df['exist_V_Loan'] = df['loan_agr']
Run Code Online (Sandbox Code Playgroud) python ×3
python-3.x ×2
dataframe ×1
decorator ×1
for-loop ×1
joblib ×1
pandas ×1
performance ×1
python-2.7 ×1
sum ×1