Diskuze: Python jak se dá za každými pěti znaky napsat jiný znak?????

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Stačí ti změnít tu podmínku, ne?
Zkus se zamyslet,
ty nechceš udělat svislou čárku pokud se "i = 4", ale chceš ji nejspíš
udělat když "i" je dělitelné počtem hvězdiček, které chceš vedle sebe
beze zbytku, ne?
Dík za radu už jsem na to s tvojí pomocí přišel
if i%5==4 neboli 5-1 za rovná se musel jsem si to ještě posunout aby to
nevypsalo za první hvězdičkou
Rychlejsi je pouzit dalsi promenou a pocitat ji do 4 nez pomale deleni.
Nedalo mi to a musel jsem to vyzkoušet.
import time
def stars(n):
for i in range(n):
print("*", end="")
if i % 5 == 4:
print("!", end="")
def stars2(n):
j = 0
for i in range(n):
print("*", end="")
j += 1
if j == 5:
print("!", end="")
j = 0
measurements1 = []
measurements2 = []
repeat = 10000
for i in range(0, repeat):
start = time.perf_counter_ns()
stars(100)
end = time.perf_counter_ns()
measurement = (end - start) / 1000
measurements1.append(measurement)
start = time.perf_counter_ns()
stars2(100)
end = time.perf_counter_ns()
measurement = (end - start) / 1000
measurements2.append(measurement)
print()
print("stars: " + str(sum(measurements1) / repeat))
print("stars2: " + str(sum(measurements2) / repeat))
-
stars: 412.83270000000033
stars2: 415.24850000000055
Vychází mi to +- stejně. Nevím jestli mám vše správně, když tak to
můžeme vyladit
Někdy je o deset mikrosekund lepší jedna funkce jindy druhá.
3.7 tam nemaji, chtel jsem to testnout s while, ale py neumim, takze mi to
tam nejede ani po snizeni poctu cyklu. A musel jsem zmenit perf, protoze 3.6
neumi nanosekundy _ns. Takze, jestli vis, co s tim, tak pak pripadne zkus zmenit
n na 10000 a pocet opakovani na mene. Treba se ty cisla budou menit.
Ale becne pro spoustu jazyku plati, ze dalsi promenna by mela byt rychlejsi nez
deleni.
A plati, ze procesory se vyvijeji a mozna to maji urychlene tak, ze to bude
stejne.
http://www.pythontutor.com/visualize.html#mode=display
import time
def stars(n):
for i in range(n):
print("*", end="")
if i % 5 == 4:
print("!", end="")
def stars2(n):
j = 0
for i in range(n):
print("*", end="")
j += 1
if j == 5:
print("!", end="")
j = 0
def stars3(n):
i = 0
j = 0
while i<n:
print("*", end="")
++j
if j == 5:
print("!", end="")
j = 0
++i
measurements1 = []
measurements2 = []
measurements3 = []
repeat = 1000
for i in range(0, repeat):
start = time.perf_counter()
stars(100)
end = time.perf_counter()
measurement = (end - start) / 100000
measurements1.append(measurement)
start = time.perf_counter()
stars2(100)
end = time.perf_counter()
measurement = (end - start) / 100000
measurements2.append(measurement)
start = time.perf_counter()
stars3(100)
end = time.perf_counter()
measurement = (end - start) / 100000
measurements3.append(measurement)
print()
print("stars: " + str(sum(measurements1) / repeat))
print("stars2: " + str(sum(measurements2) / repeat))
print("stars3: " + str(sum(measurements3) / repeat))
Python neumí jednoduché ++ Je třeba to psát jako += 1
Výsledky:
stars: 1254.4322000000031
stars2: 1321.747599999994
stars3: 1377.4502999999913
Aha. Ale mi to prave nechtelo chodit ani s tim.
To pak postrada jakykoliv smysl. Inc byva tak o 1/3 rychlejsi nez +1, takze by
se vyplatilo kvuli tomu mit dalsi promenou.
On nejspis je problem dole v tom limitu.
Jeste jsem zkusil tuhle upravu.
from time import perf_counter
def stars(n):
for i in range(n):
print("*", end="")
if i % 5 == 4:
print("!", end="")
def stars2(n):
j = 0
for i in range(n):
print("*", end="")
j += 1
if j == 5:
print("!", end="")
j = 0
def stars3(n):
i = 0
j = 0
while (i < n):
print("*", end="")
j += 1
if j == 5:
print("!", end="")
j = 0
i += 1
measurement1 = 0
measurement2 = 0
measurement3 = 0
repeat = 10
for i in range(0, repeat):
# start = perf_counter()
# stars(100)
# end = perf_counter()
# measurement1 = end - start
# start = perf_counter()
# stars2(100)
# end = perf_counter()
# measurement2 = end - start
start = perf_counter()
stars3(100)
end = perf_counter()
measurement3 = end - start
print()
print("stars: " + str(measurement1) )
print("stars2: " + str(measurement2) )
print("stars3: " + str(measurement3) )
#measurement1 0.093
#measurement2 0.1291
#measurement3 0.1544
Vysvetlí mi niekto, aký má pre autora vlákna zmysel merať rýchlosť zvyšku po delením vs premennej na počítadlo?
IMHO to pre začiatočníka, ktorý ledva začína chápať základy programovania na strednej nie je podstatné vôbec. Ak niekomu reálne záleží na takto malých rozdieloch v rýchlosti, tak 1) buď pravdepodobne vôbec nepoužíva Python, alebo 2) nemá problém pozrieť sa na CPython repo na githube. Resp. dosť pravdepodobne dokonca vie, na aké operácie v ASM sa to in the end preloží aj bez toho, aby sa tam musel pozerať.
Smysl je prostý, naučí se lépe optimalizovat a nahlížet na úlohu více způsoby. Schopnost dokázat zvolit vhodný algoritmus pro vyřešení úlohy je to, co odlišuje běžného programátora od čaroděje. Co se týká rychlosti, naprosto souhlasím.. Jeden z důvodů, proč nepoužívám Python ale C..
Zobrazeno 10 zpráv z 10.