Potenza in python

Rametto (4910 points)
3 4 25
asked Oct 9, 2020 in Programmare in Python by Rametto (4,910 points)
reopened Oct 9, 2020 by Rametto
Sarebbe meglio usare la funzione "pow()" oppure quella "math.sqrt()" per la radice. importare la libreria math aumenta il tempo di esecuzione?

Quindi magari fare "pow(var, 1/2)" o semplicemente "math.sqrt(var)"
906 views

6 Answers

Best answer
giordano_sannino (13650 points)
7 16 81
answered Oct 9, 2020 by giordano_sannino (13,650 points)
selected Oct 16, 2020 by Rametto
Ciao, come hai detto tu per pow non serve importare la libreria math.

Penso che il tempo di esecuzione non incida troppo, se ti serve fare una radice non quadrata(cubica o altro) sqrt non va bene quindi devi per forza usare "pow()".

Consiglio bonus: Puoi anche elevare il numero alla 1/n per avere la radice :)
Rametto (4910 points)
3 4 25
commented Oct 9, 2020 by Rametto (4,910 points)
Grazie giordano_sannino, ma nella libreria math ci sono delle radici cubiche o superiori?
giordano_sannino (13650 points)
7 16 81
commented Oct 9, 2020 by giordano_sannino (13,650 points)
la libreria include sqrt() che fa la radice quadrata. Se intendi altre funzioni come la sqrt ma che facciano una specifica radice ennesima non ci sono(o almeno non si usano/non le ho mai viste), usa pow e puoi fare qualunque radice.
C
ColellaV (1040 points)
2 3 9
commented Oct 10, 2020 by ColellaV (1,040 points)

Attenzione ad usare le potenze per fare le radici, se la base è negativa Python va ad usare i numeri complessi:

In [1]: a = -27
In [2]: a**(1/3)
Out[2]: (1.5000000000000004+2.598076211353316j)
dolcetto_gommoso (2790 points)
3 6 18
answered Oct 9, 2020 by dolcetto_gommoso (2,790 points)
sicuramente per usare pow() non devi importare la libreria math, ma usando math.sqrt() il codice è più chiaro e facile da interpretare. Per il tempo non saprei... ma penso non abbia importanza poichè è una differenza minima
Rametto (4910 points)
3 4 25
commented Oct 9, 2020 by Rametto (4,910 points)
Grazie Mille dolcetto_gommoso per la risposta e il consiglio
andrea.sterbini (172680 points)
511 927 1776
answered Oct 10, 2020 by andrea.sterbini (172,680 points)

Provate ad usare il comando %timeit di ipython

In [1]: import math

In [2]: %timeit math.sqrt(400)
78.4 ns ± 0.608 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [3]: %timeit 400 ** 0.5
6.03 ns ± 0.0852 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

In [4]: A = 10**30

In [5]: %timeit A ** 0.5
127 ns ± 1.44 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [6]: %timeit math.sqrt(A)
118 ns ± 1.44 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [7]: A = 10**100

In [8]: %timeit math.sqrt(A)
115 ns ± 1.9 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [9]: %timeit A ** 0.5
127 ns ± 1.66 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [10]: A = 10.5**100

In [11]: %timeit A ** 0.5
63.6 ns ± 0.273 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [12]: %timeit math.sqrt(A)
76.6 ns ± 2.17 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

Rametto (4910 points)
3 4 25
commented Oct 12, 2020 by Rametto (4,910 points)
Grazie mille
w.smorti (810 points)
1 5 11
answered Oct 12, 2020 by w.smorti (810 points)

Ciao Rametto,
incuriosito dalla tua domanda ho indagato grazie al suggerimento del Prof. Sterbini.
Giocando con il codice ho ottenuto questi dati che in teoria confermano l'ottimizzazione della funzione "sqrt".
Per 10M di iterazioni abbiamo:
"""
Time for [**0.5]: 5.879590799999278
Time for [**1/2]: 4.535426599999482
Time for [sqrt]: 2.3892071999998734
Time for [pow(A,0.5)]: 3.03922010000133
"""

Posto il codice di esempio, se può incuriosire, non avendo collegamento alcuno con HWs. (Spero si possa fare :) )

import math
import timeit

mysetup = ""
mycode='''\nA=500\nA ** 1/2\n'''
print("Time for [**0.5]: " + str(timeit.timeit(setup = mysetup,stmt = mycode,number = 10000000)))

mysetup = ""
mycode='''\nA=500\nA ** 0.5\n'''
print("Time for [**1/2]: " + str(timeit.timeit(setup = mysetup,stmt = mycode,number = 10000000)))

mysetup = "import math"
mycode='''\nA=500\npow(A,0.5)\n'''
print("Time for [pow(A,0.5)]: " + str(timeit.timeit(setup = mysetup,stmt = mycode,number = 10000000)))

mysetup = "import math"
mycode='''\nA=500\nmath.sqrt(A)\n'''
print("Time for [sqrt]: " + str(timeit.timeit(setup = mysetup,stmt = mycode,number = 10000000)))

K
Kiltei (Michele) (590 points)
2 7 10
answered Oct 12, 2020 by Kiltei (Michele) (590 points)
Io di solito utilizzo, come ti è stato suggerito sotto, la potenza 1/n cosi da poter fare ogni radice. Per eventuali basi negative puoi utilizzare il comando  abs() che ti restituisce il valore assoluto di un numero e poi regolarti.
A
Alessio_Borgi (660 points)
0 2 6
answered Oct 12, 2020 by Alessio_Borgi (660 points)
Ciao rametto,

Chiaramente la funzione "pow()" è usata per quanto riguarda gli esponenziali(**). Utilizzarla per la radice sarebbe più una scorciatoiaò A mio avviso molto meglio utilizzar ele funzioni built-in come quella "math.sqrt()" per la radice. Inoltre non credo che l'importazione del modulo math comporti un'aumento del tempo di esecuzione o comunque se ci sta è veramente irriconoscibile.