Tôi đã cố gắng để làm cho một tinh khiết-python (không có phụ thuộc bên ngoài) so sánh yếu tố khôn ngoan của hai trình tự. giải pháp đầu tiên của tôi là:Hiệu suất của bản đồ so với starmap?
list(map(operator.eq, seq1, seq2))
Sau đó, tôi tìm thấy starmap
chức năng từ itertools
, mà dường như khá giống với tôi. Nhưng hóa ra lại nhanh hơn 37% trên máy tính của tôi trong trường hợp xấu nhất. Vì nó là không rõ ràng với tôi, tôi đo thời gian cần thiết để lấy 1 phần tử từ một máy phát điện (không biết nếu theo cách này là chính xác):
from operator import eq
from itertools import starmap
seq1 = [1,2,3]*10000
seq2 = [1,2,3]*10000
seq2[-1] = 5
gen1 = map(eq, seq1, seq2))
gen2 = starmap(eq, zip(seq1, seq2))
%timeit -n1000 -r10 next(gen1)
%timeit -n1000 -r10 next(gen2)
271 ns ± 1.26 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
208 ns ± 1.72 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
Trong lấy yếu tố giải pháp thứ hai là performant hơn 24% . Sau đó, cả hai đều tạo ra kết quả tương tự cho list
. Nhưng từ một nơi nào đó, chúng tôi nhận được thêm 13% trong thời gian:
%timeit list(map(eq, seq1, seq2))
%timeit list(starmap(eq, zip(seq1, seq2)))
5.24 ms ± 29.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.34 ms ± 84.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Tôi không biết cách tìm hiểu kỹ hơn về định dạng mã lồng nhau? Vì vậy, câu hỏi của tôi là lý do tại sao các máy phát điện đầu tiên nhanh hơn trong việc lấy và từ nơi chúng tôi đạt được thêm 13% trong chức năng list
?
EDIT: Ý định đầu tiên của tôi là thực hiện so sánh yếu tố khôn ngoan thay vì all
, do đó, chức năng all
đã được thay thế bằng list
. Sự thay thế này không ảnh hưởng đến tỷ lệ thời gian.
CPython 3.6.2 trên Windows 10 (64bit)
Tại sao không chỉ sử dụng 'seq1 = = seq2'? –
@ Błotosmętek cảm ơn bạn đã sửa! Ý định đầu tiên của tôi là so sánh nguyên tố thay vì 'all', điều không rõ ràng từ câu hỏi của tôi :) Thực sự nếu bạn thay thế' list' thay vì 'all' thứ tự của thời gian sẽ giống nhau. – godaygo
Phiên bản Python nào? Và đây có phải là CPython không? – MSeifert