小编Gra*_*her的帖子

为什么`for`循环这么快才能计算True值?

我最近在一个姐妹网站上回答了一个问题,问题要求一种功能来计算数字的所有偶数位。其中的其他的答案中包含两个功能(这被证明是最快的,至今):

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)

python performance for-loop sum python-3.x

53
推荐指数
4
解决办法
3512
查看次数

为什么“joblib.delayed”不能用作装饰器?

该包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 decorator python-2.7 python-decorators joblib

5
推荐指数
1
解决办法
664
查看次数

减少python中的循环时间

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 dataframe python-3.x pandas

1
推荐指数
1
解决办法
145
查看次数