Một số thông tin về rằng ví dụ cụ thể: Nếu bạn chỉ muốn lặp, bản đồ hoặc lọc kết quả, bạn có thể sử dụng một máy phát điện để tránh một bản sao mảng:
import itertools
files = itertools.islice(files, batch_size)
Đối với các trường hợp chung : Cho dù bạn gán giá trị mới cho một tên đã tồn tại hay một tên mới thì hoàn toàn không có sự khác biệt (ít nhất là từ quan điểm của trình thông dịch/VM). Cả hai phương pháp sản xuất gần như giống nhau bytecode chính xác:
Python 2.7.2 (default, Nov 21 2011, 17:25:27)
[GCC 4.6.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> def func1(files):
... files = files[:100]
...
>>> def func2(files):
... new_files = files[:100]
...
>>> dis.dis(func1)
2 0 LOAD_FAST 0 (files)
3 LOAD_CONST 1 (100)
6 SLICE+2
7 STORE_FAST 0 (files)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(func2)
2 0 LOAD_FAST 0 (files)
3 LOAD_CONST 1 (100)
6 SLICE+2
7 STORE_FAST 1 (new_files)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
Cùng có thể quan sát bằng Python 3.
Trong thực tế, func1
thậm chí có thể nhanh hơn một chút, bởi vì tên files
đã được nhìn thấy trước và có thể đã có trong một số bộ nhớ cache tra cứu biến.
Nguồn
2012-01-29 16:12:57
Tôi không thấy câu hỏi ở đây là gì. Lựa chọn thay thế để so sánh là gì? Sử dụng biến thứ hai như 'files = XYZ; files_head = files [: batch_size] '? Tại sao nên có bất kỳ sự khác biệt? –
thay thế là một cái gì đó như: new_set_of_files = files [: batch_size] – jldupont
Bạn sẽ nhận thấy chính ngay lập tức: * Hey! Tôi vẫn cần giá trị cũ cho 'tệp'! *. – Droogans