nó có vẻ như phạm vi là biết . Giả sử nó đi lên tới 1 < < 20, chỉ để làm cho nó thú vị hơn:
max_log2=20
Vì vậy, làm cho một danh sách đó (có hiệu lực) bản đồ một số nguyên để cơ sở 2 logarit của nó. Sau đây sẽ thực hiện thủ thuật:
log2s_table=[0]*((1<<max_log2)+1)
for i in range(max_log2+1):
log2s_table[1<<i]=i
(Điều này không làm bất cứ điều gì hữu ích cho các số không có quyền hạn của hai người); sửa chữa mặc dù đó)
chức năng để có được logarit là rất đơn giản, và có thể dễ dàng được inlined:.
def table(v):
return log2s_table[v]
tôi không thể đảm bảo rằng mã thử nghiệm tôi đã viết là chính xác giống như một trong những được sử dụng để có được thời gian ví dụ, nhưng điều này là khá nhanh hơn so với stringcount
mã:
stringcount: 0.43 s.
table: 0.16 s.
Vì tất cả các giá trị trong bảng là ít hơn 256, tôi tự hỏi liệu sử dụng một chuỗi thay vì một danh sách sẽ được nhanh hơn, hoặc có thể một array.array
byte, nhưng không có con xúc xắc:
string: 0.25 s.
arr: 0.21 s.
Sử dụng một dict
để làm tra cứu là một khả năng khác, lợi dụng con đường duy nhất, quyền hạn của hai đang được kiểm tra:
log2s_map=dict([(1<<x,x) for x in range(max_log2+1)])
def map(v):
return log2s_map[v]
Kết quả cho điều này là không tốt, mặc dù:
map: 0.20 s.
Và chỉ để cho vui người ta cũng có thể sử dụng phương pháp hex
trên các đối tượng phao để có được một chuỗi bao gồm (như phần cuối cùng của nó) cơ sở 2 số mũ của con số.Đây là một chút chậm chạp trong việc trích xuất nói chung, nhưng nếu số mũ chỉ bao giờ sẽ trở thành một chữ số nó có thể được thực hiện thẳng thắn đủ:
def floathex(v):
return ord(float(v).hex()[-1])-48
này là hoàn toàn cho dù giá trị giải trí như nó đã được uncompetetive - mặc dù , đáng ngạc nhiên, vẫn nhanh hơn cách tiếp cận bitwise.
Vì vậy, có vẻ như sử dụng danh sách là cách để thực hiện.
(Cách tiếp cận này sẽ không quy mô vô thời hạn do bộ nhớ bị giới hạn, nhưng bù lại tốc độ thực thi sẽ không phụ thuộc vào max_log2
hoặc giá trị đầu vào theo bất kỳ cách nào bạn sẽ thấy khi chạy python Về mức tiêu thụ bộ nhớ, nếu tôi nhớ chính xác nội dung python, bảng sẽ chiếm khoảng (1<<max_log2)*4
byte, vì nội dung là tất cả các số nguyên nhỏ mà trình thông dịch sẽ tự động thực hiện. SO, khi max_log2
là 20, tức là khoảng 4MB.)
Tôi chỉ muốn thêm hai tài liệu tham khảo. Đầu tiên, Bytecodes nhanh cho các ngôn ngữ vui của Cliff Cock, http://www.infoq.com/presentations/click-fast-bytecodes-funny-languages từ Hội nghị thượng đỉnh ngôn ngữ JVM 2008 thảo luận về tối ưu hóa được sử dụng và bỏ qua bởi các ngôn ngữ "ít phổ biến hơn" . Thứ hai là thủ thuật tối ưu hóa trình biên dịch C của tiểu bang C http://lambda-the-ultimate.org/node/3674 của Felix von Leitner, trình bày tại Linux Kongress 2009, nó trình bày cách trình biên dịch (môi trường) thông minh của bạn ngày nay, và lý do tại sao bạn nên rất cẩn thận khi giả sử bạn cần phải sử dụng thủ thuật phong cách Michael Abrash. – mctylr
@mctylr - Cảm ơn bạn đã tham khảo (+1) – mac