python len() 是否比仅计数更快

Does python len() faster than just counting

根据我的理解(但实际上没有测试)使用 len() 函数计算字符串的 len(例如)比简单地计算同一字符串中的字符数花费的时间更少,因为 len() 以某种方式进行了优化。 是这样吗?用简单的话来说它是如何工作的?

后续的实际问题可能是:“如果可能的话,就 O(code) 复杂度而言,使用 len(string) 之类的东西在代码中进行早期错误检测通常是一个好习惯”

谢谢

已更新。 最初我没有提供任何代码,所以现在只是添加它,希望如果我没有弄乱它,它会有点代表性。

import timeit


def len_test(arr):
    return len(arr)


def manual_count(num):
    ln = 0
    i = 0
    while i < num:
        ln += 1
        i += 1
    return ln



for i in range(1000, 10000, 1000):
    count = i
    array = [_ for _ in range(i)]

    t1 = timeit.timeit(stmt='len_test(array)', setup='from __main__ import len_test, array', number=count)
    t2 = timeit.timeit(stmt='manual_count(count)', setup='from __main__ import manual_count, count', number=count)

    print('i: {}, len:{:.8}, count: {:.8}'.format(i, t1, t2))

i: 1000, len:0.0001499, count: 0.12168087
i: 2000, len:0.000327363, count: 0.53221788
i: 3000, len:0.000449699, count: 1.167412
i: 4000, len:0.000595823, count: 2.1061223
i: 5000, len:0.000762714, count: 3.2617024
i: 6000, len:0.000937534, count: 4.8079927
i: 7000, len:0.001076862, count: 6.5171025
i: 8000, len:0.001222231, count: 9.3587468
i: 9000, len:0.001398561, count: 11.686714
from timeit import default_timer as timer

test = [x for x in range(1000)]
count = 0

start = timer()
len(test)
end = timer()
print(end - start)

start = timer()
for i in test:
    count += 1
end = timer()
print(end - start)

Returns:

2.643069343567298e-06

213.7110354941546e-06

如果test = "This is a test string."

Returns:

2.2654880087719696e-06

1.0572277374269745e-05

我在真实条件下检查过,计数比 len() 快 2 倍或更多。

我读取两个CSV格式文本然后计算行数的代码是这样的:

import time
import csv

start_time = time.time()

psr = open('e_psr.txt')
cpr = open('e_cp.txt')

csv_psr = csv.reader(psr, delimiter=',')
csv_cp = csv.reader(cpr, delimiter=',')

csv_cp_copy = []
csv_psr_copy = []
r=0
e=0
for row in csv_psr:
    csv_psr_copy.append(row)
for row in csv_cp:
    csv_cp_copy.append(row)
e = len(csv_cp_copy)
r = len(csv_psr_copy)
psr.close()
cpr.close()

print(e,r)
print("\n--- %s seconds ---" % (time.time() - start_time))

当我在 for 循环 (e += 1) 中用一个简单的计数器替换 len() 时,结果发生了显着变化。

return 与 len():

10000 10000

--- 0.13390278816223145 seconds ---

return 计数器:

10000 10000

--- 0.05642294883728027 seconds ---