Hướng dẫn how does python calculate power faster? - Làm thế nào để python tính toán sức mạnh nhanh hơn?

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____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ư:

  1. Nếu chúng ta tính toán pow (a, 2n), thì đó sẽ là (a^n)^2
  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 < 0:
return1/power (cơ sở, -exp) 1 / power(base, -exp)
ans=1 = 1
whileeexp: exp:
IFEXP & 1: exp & 1:
ans*=base *= base
exp >> = 1 >>= 1
base*=base *= base
trở về ans

Làm thế nào để Python tính toán sức mạnh lớn?

Python EXPOMENT - Nâng một số lên một sức mạnh..
Để nâng một số lên một nguồn điện trong Python, hãy sử dụng toán tử Python Adbonent ** ..
Ví dụ, 23 được tính bằng:.
Và nói chung là N cho sức mạnh của M bởi:.
Ví dụ, một tỷ (1 000 000 000) là 109. ....
Số mũ là số lần số được nhân với chính nó ..

Làm thế nào để Python tính toán sức mạnh?

Để tính năng lượng trong Python, hãy sử dụng hàm pow ().POW () là một hàm Python tích hợp, trả lại x cho sức mạnh của y.Nếu đối số thứ ba (z) được đưa ra, nó sẽ trả lại x cho sức mạnh của mô đun y z, tức là, pow (x, y) % z.Hàm pow () chuyển đổi các đối số của nó thành float và tính năng lượng.use the pow() function. The pow() is a built-in Python function that returns x to the power of y. If the third argument (z) is given, it returns x to the power of y modulus z, i.e., pow(x, y) % z. The pow() function converts its arguments into float and computes the power.

POW có nhanh hơn python nhân không?

pow () hiệu quả hơn so với phép nhân chuỗi ở các công suất lớn hơn 5 và luôn hiệu quả hơn toán tử **, do đó không bao giờ có lý do để sử dụng **. and always more efficient than the ** operator, so there is never a reason to use ** .