Tôi đã có một vấn đề tương tự để giải quyết vì vậy tôi đã gặp câu hỏi này. Tôi đã làm một so sánh hiệu suất của câu trả lời của Andrew Clark và naraya mà tôi muốn chia sẻ.
Sự khác biệt chính giữa hai câu trả lời là cách chúng lặp đi lặp lại qua danh sách bên trong. Một trong số họ sử dụng bản đồ dựng sẵn , trong khi khác là sử dụng khả năng hiểu danh sách. Chức năng bản đồ có lợi thế hiệu suất nhẹ so với khả năng hiểu danh sách tương đương nếu nó không yêu cầu sử dụng lambdas . Vì vậy, trong bối cảnh của câu hỏi nàymap
nên thực hiện tốt hơn một chút so với hiểu danh sách.
Hãy làm một tiêu chuẩn hiệu suất để xem nếu nó thực sự đúng. Tôi đã sử dụng python phiên bản 3.5.0 để thực hiện tất cả các thử nghiệm này. Trong bộ thử nghiệm đầu tiên, tôi muốn giữ các yếu tố trong mỗi danh sách là 10 và số lượng danh sách khác nhau từ 10 - 100.000
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*10]"
>>> 100000 loops, best of 3: 15.2 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*10]"
>>> 10000 loops, best of 3: 19.6 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*100]"
>>> 100000 loops, best of 3: 15.2 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*100]"
>>> 10000 loops, best of 3: 19.6 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*1000]"
>>> 1000 loops, best of 3: 1.43 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*1000]"
>>> 100 loops, best of 3: 1.91 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*10000]"
>>> 100 loops, best of 3: 13.6 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*10000]"
>>> 10 loops, best of 3: 19.1 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*100000]"
>>> 10 loops, best of 3: 164 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*100000]"
>>> 10 loops, best of 3: 216 msec per loop
Trong các thử nghiệm tiếp theo, tôi muốn nâng số lượng phần tử trên mỗi danh sách lên 100 .
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*10]"
>>> 10000 loops, best of 3: 110 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*10]"
>>> 10000 loops, best of 3: 151 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*100]"
>>> 1000 loops, best of 3: 1.11 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*100]"
>>> 1000 loops, best of 3: 1.5 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*1000]"
>>> 100 loops, best of 3: 11.2 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*1000]"
>>> 100 loops, best of 3: 16.7 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*10000]"
>>> 10 loops, best of 3: 134 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*10000]"
>>> 10 loops, best of 3: 171 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*100000]"
>>> 10 loops, best of 3: 1.32 sec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*100000]"
>>> 10 loops, best of 3: 1.7 sec per loop
Hãy thực hiện một bước dũng cảm và sửa đổi số lượng phần tử trong danh sách thành 1000
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*10]"
>>> 1000 loops, best of 3: 800 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*10]"
>>> 1000 loops, best of 3: 1.16 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*100]"
>>> 100 loops, best of 3: 8.26 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*100]"
>>> 100 loops, best of 3: 11.7 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*1000]"
>>> 10 loops, best of 3: 83.8 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*1000]"
>>> 10 loops, best of 3: 118 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*10000]"
>>> 10 loops, best of 3: 868 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*10000]"
>>> 10 loops, best of 3: 1.23 sec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*100000]"
>>> 10 loops, best of 3: 9.2 sec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*100000]"
>>> 10 loops, best of 3: 12.7 sec per loop
Từ những thử nghiệm này, chúng tôi có thể kết luận rằng map
có lợi ích về hiệu suất so với việc hiểu danh sách trong trường hợp này. Điều này cũng có thể áp dụng nếu bạn đang cố gắng chuyển sang một trong hai int
hoặc str
. Đối với số lượng nhỏ danh sách có ít thành phần trên mỗi danh sách, sự khác biệt là không đáng kể. Đối với các danh sách lớn hơn có nhiều yếu tố hơn trên mỗi danh sách, người ta có thể muốn sử dụng map
thay vì hiểu danh sách, nhưng nó hoàn toàn phụ thuộc vào nhu cầu ứng dụng.
Tuy nhiên, cá nhân tôi thấy việc hiểu danh sách trở nên dễ đọc và thành ngữ hơn map
. Nó là một tiêu chuẩn thực tế trong trăn. Thông thường mọi người thành thạo và thoải mái hơn (đặc biệt là người mới bắt đầu) trong việc sử dụng hiểu danh sách hơn map
.