Trong khi lược tả ứng dụng Python của tôi, tôi phát hiện ra rằng len()
có vẻ là một cái rất đắt tiền khi sử dụng bộ. Xem mã bên dưới:Hiệu suất cấu hình của len (set) so với tập hợp .__ len __() trong Python 3
import cProfile
def lenA(s):
for i in range(1000000):
len(s);
def lenB(s):
for i in range(1000000):
s.__len__();
def main():
s = set();
lenA(s);
lenB(s);
if __name__ == "__main__":
cProfile.run("main()","stats");
Theo số liệu thống kê hồ sơ của bên dưới, lenA()
có vẻ là chậm hơn so với lenB()
14 lần:
ncalls tottime percall cumtime percall filename:lineno(function)
1 1.986 1.986 3.830 3.830 .../lentest.py:5(lenA)
1000000 1.845 0.000 1.845 0.000 {built-in method len}
1 0.273 0.273 0.273 0.273 .../lentest.py:9(lenB)
Tôi có thiếu cái gì? Hiện nay tôi sử dụng __len__()
thay vì len()
, nhưng mã trông bẩn :(
Tại sao bạn sử dụng 'cProfile' thay vì' timeit'? Trước đây là để tìm ra tắc nghẽn trong các chương trình lớn, và hy sinh một số độ chính xác trên quy mô nhỏ cho nó. Thứ hai là để đo hiệu suất tổng thể của các đoạn nhỏ tương đối chính xác. 'timeit' nên là lựa chọn đầu tiên cho microbenchmarks như thế này. Và đối với tôi, nó cho thấy một sự khác biệt cực thấp (0,0879 µs cho mỗi cuộc gọi 'len', 0,125 µs trên' .__ len__' call => 'len' chậm hơn 70%). – delnan
Cảm ơn @delnan, tôi khá mới trong Python. Sử dụng 'timeit' tôi cũng nhận được tỷ lệ tương tự. Thật vậy, chương trình của tôi là lớn hơn nhiều so với mã trên, nhưng nó làm tôi ngạc nhiên rằng hàm 'len()' xuất hiện như một trong những nút cổ chai chính. OK, vì vậy tôi sẽ bỏ qua 'len()' và tập trung vào các chức năng của riêng tôi, đúng không? – Tregoreg