Làm điều này trong kiểm tra số mũ sẽ làm chậm các trường hợp không phải là sức mạnh đơn giản của hai người rất nhẹ, vì vậy không nhất thiết là một chiến thắng. Tuy nhiên, trong trường hợp số mũ được biết trước [ví dụ: sử dụng theo nghĩa đen 2], mã byte được tạo ra có thể được tối ưu hóa với tối ưu hóa pephole đơn giản. Có lẽ điều này chỉ đơn giản là không được coi là đáng để làm [đó là một trường hợp khá cụ thể].
Đây là một bằng chứng nhanh về khái niệm thực hiện tối ưu hóa như vậy [có thể sử dụng như một người trang trí]. Lưu ý: Bạn sẽ cần mô -đun byteplay để chạy nó.
import byteplay, timeit
def optimise[func]:
c = byteplay.Code.from_code[func.func_code]
prev=None
for i, [op, arg] in enumerate[c.code]:
if op == byteplay.BINARY_POWER:
if c.code[i-1] == [byteplay.LOAD_CONST, 2]:
c.code[i-1] = [byteplay.DUP_TOP, None]
c.code[i] = [byteplay.BINARY_MULTIPLY, None]
func.func_code = c.to_code[]
return func
def square[x]:
return x**2
print "Unoptimised :", timeit.Timer['square[10]','from __main__ import square'].timeit[10000000]
square = optimise[square]
print "Optimised :", timeit.Timer['square[10]','from __main__ import square'].timeit[10000000]
Trong đó cung cấp thời gian:
Unoptimised : 6.42024898529
Optimised : 4.52667593956
[Chỉnh sửa] Thật ra, nghĩ về nó nhiều hơn một chút, có một lý do rất chính đáng tại sao Optimisaton này không được thực hiện. Không có gì đảm bảo rằng ai đó sẽ không tạo một lớp do người dùng xác định ghi đè các phương thức __mul__
và __pow__
và làm điều gì đó khác biệt cho mỗi phương thức. Cách duy nhất để làm điều đó một cách an toàn là nếu bạn có thể đảm bảo rằng đối tượng trên đỉnh của ngăn xếp là một đối tượng có cùng kết quả "x**2
" và "x*x
", nhưng hoạt động khó khăn hơn nhiều. Ví dụ. Trong ví dụ của tôi, không thể, vì bất kỳ đối tượng nào cũng có thể được chuyển đến hàm vuông. Actually, thinking about it a bit more, there's a very good reason why this optimisaton isn't done. There's no guarantee that someone won't create a user defined class that overrides the __mul__
and __pow__
methods and do something different for each. The only way to do
it safely is if you can guarantee that the object on the top of the stack is one that has the same result "x**2
" and "x*x
", but working that out is much harder. Eg. in my example it's impossible, as any object could be passed to the square function.
Chủ đề: Số mũ nhanh trong Python.Fast exponentiation in Python.
Số mũ là gì?
Chà, nếu bạn muốn tính toán sức mạnh của một số số liên quan đến một số số khác, đó được gọi là số mũ. Bây giờ, nếu chúng ta muốn tính toán 2^4 hoặc pow [2,4], thì nói chung, những gì chúng ta sẽ làm.
Đơn giản, chạy một vòng lặp từ 1 đến 4 và nhân 2 không có lần. Vì vậy, dưới đây là cách tiếp cận nơi chúng ta có thể tính toán giá trị công suất.
#Compute power[a,b] s=1 for i in range[b]: s=s*a return s
Vì vậy, trong cách tiếp cận trên, sự phức tạp sẽ là O [B].
Bây giờ, làm thế nào chúng ta có thể giảm thiểu sự phức tạp. Đối với điều đó, chúng tôi sẽ học ở đây số mũ nhanh.
Số mũ nhanh là gì?
Theo cách tiếp cận này, chúng tôi sẽ chỉ cần chia thuật toán của chúng tôi trong các bước sau. Ở đây nếu chúng ta muốn tính toán một số năng lượng thì chúng ta sẽ chỉ cần chia giá trị công suất theo cách dưới đây.
Bạn có thể học: & nbsp; mô -đun toán học của python
Cách tìm số mũ nhanh trong Python
Chúng ta hãy lấy một ví dụ về POW [2,10]. Trong cách tiếp cận trên của hội chợ triển lãm bình thường, chúng ta phải chạy vòng lặp 10 lần. Bây giờ, điều gì sẽ xảy ra nếu chúng ta thực hiện hội chợ triển lãm nhanh ở đây ..
P [2,10]
P [2,5]
P [2,2]
Bây giờ, chúng tôi & nbsp; Có thể thấy rằng tính toán trước của sức mạnh có thể được thực hiện chỉ trong 3 bước. Có phải nó thật tuyệt không?
Chúng ta chỉ cần xem xét thuật toán/mã bên dưới.
Nói chung, thuật toán sẽ giống như:
- Nếu chúng ta tính toán pow [a, 2n], thì đó sẽ là [a^n]^2
- Nếu chúng ta tính toán pow [a, 2n+1], thì đó sẽ là [a^n]^2 * a
Đây là mã dưới đây trong Python:
#Fast Expo In Python ------ def Power[a,n]: if[n==0]: return 1 x=power[a,n/2] x=x*x if[n%2==1]: x=x*a return x
a=2 #Input 1 n=4 #Input 2 print[Power[a,n]] #Output : 16
Độ phức tạp về thời gian của số mũ nhanh là O [logn]. Bạn có thể dễ dàng tìm thấy rằng trong ví dụ trên của chúng tôi, nơi chúng tôi đã giảm vấn đề 10 bước thành 3 bước.
Tôi hy vọng bạn đã thích bài viết và cảm ơn vì đã đọc !!!!!
Ngôi sao
Nhúng
Bạn thích làm gì?
Tính toán năng lượng nhanh trong Python
Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều
Defpower [cơ sở, exp]: power[base, exp]: | |
"" "Tính toán năng lượng nhanh bằng cách sử dụng bình phương lặp đi lặp lại" "" | |
IFEXP exp > = 1 >>= 1 | |
base*=base *= base | |
trở về ans |