Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Potenza in python

Rametto (4910 points)
3 4 25
in Programmare in Python by (4.9k points)
closed by
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)"
2.0k views
closed

6 Answers

Best answer
giordano_sannino (13650 points)
7 16 81
by (13.7k points)
selected by
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
by (4.9k points)
Grazie giordano_sannino, ma nella libreria math ci sono delle radici cubiche o superiori?
giordano_sannino (13650 points)
7 16 81
by (13.7k 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 10
by (1.0k 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)
4 6 18
by (2.8k 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
by (4.9k points)
Grazie Mille dolcetto_gommoso per la risposta e il consiglio
andrea.sterbini (207920 points)
750 1267 2373
by (208k 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
by (4.9k points)
Grazie mille
w.smorti (810 points)
2 5 11
by (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)
3 7 10
by (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
by (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.