【问题标题】:why use True is slower than use 1 in Python3为什么在 Python3 中使用 True 比使用 1 慢
【发布时间】:2020-01-10 07:44:33
【问题描述】:

我读过这个问题:Why is if True slower than if 1?,但我现在使用的是 Python3。我正在写 leetcode 204,有人说用一个比用两个快。

我的代码:

import timeit

count = 1000


def countPrimes(n=100000):
    if n < 3:
        return 0
    primes = [True] * n
    primes[0], primes[1] = False, False
    for i in range(2, int(n ** 0.5) + 1):
        if primes[i]:
            for j in range(i * i, n, i):
                primes[j] = False
    return sum(primes)


def countPrimes2(n=100000):
    if n < 3:
        return 0
    primes = [1] * n
    primes[0], primes[1] = 0, 0
    for i in range(2, int(n ** 0.5) + 1):
        if primes[i]:
            for j in range(i * i, n, i):
                primes[j] = 0
    return sum(primes)


print('use False,True                 ', timeit.timeit(countPrimes, number=count))
print('use 0,1                        ', timeit.timeit(countPrimes2, number=count))

结果是:

-> % python3 test.py 
use False,True                  10.634566191001795
use 0,1                         9.187052419991232

谁能告诉我为什么?

【问题讨论】:

  • 可能是因为sum(primes) 必须将所有True/False 转换为0/1
  • 同意弗拉斯。这可能取决于您的机器等,但仅转换就会产生超过 1 毫秒的时间差。其余的我建议调试特定的功能。

标签: python python-3.x


【解决方案1】:

好的,正如 furas 所说,这是花费很多时间的总和:

import timeit

count = 1000

def countPrimes(n=100000):
    primes = [True] * n
    return sum(primes)

def countPrimes2(n=100000):
    primes = [1] * n
    return sum(primes)

print('use False,True                 ', timeit.timeit(countPrimes, number=count))
print('use 0,1                        ', timeit.timeit(countPrimes2, number=count))

结果是:

-> % python3 test.py
use False,True                  2.4546820300165564
use 0,1                         1.0242620470235124

没有总和:

import timeit

count = 1000

def countPrimes(n=100000):
    if n < 3:
        return 0
    primes = [True] * n
    primes[0], primes[1] = False, False
    for i in range(2, int(n ** 0.5) + 1):
        if primes[i]:
            for j in range(i * i, n, i):
                primes[j] = False

def countPrimes2(n=100000):
    if n < 3:
        return 0
    primes = [1] * n
    primes[0], primes[1] = 0, 0
    for i in range(2, int(n ** 0.5) + 1):
        if primes[i]:
            for j in range(i * i, n, i):
                primes[j] = 0

print('use False,True                 ', timeit.timeit(countPrimes, number=count))
print('use 0,1                        ', timeit.timeit(countPrimes2, number=count))

结果是:

-> % python3 test.py
use False,True                  8.47771276300773
use 0,1                         8.44074950099457

时间差不多

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多