Bagaimana cara mempercepat perhitungan saya dengan loop? Python
Saya menulis kode ini. Tapi itu bekerja sangat lambat.
Saya mencari tahu berapa kali saya harus menjalankan generator case untuk menemukan angka kurang dari atau sama dengan inv, dalam hal ini enam. Saya menghitung jumlah upaya sampai digit <= 6 dihasilkan. Saya menemukan inv sama dengan 1 dan mengulangi loop. Sampai inv adalah 0. Saya akan terus mencoba menghasilkan enam digit <= 6.
Dan saya akan mengulangi semua 10 ** 4 derajat ini lagi untuk menemukan mean aritmatika.
Bantu saya mempercepat kode ini. Bekerja sangat lambat. Solusinya harus tanpa modul pihak ketiga. Saya akan sangat berterima kasih. Terima kasih!
import random
inv = 6
def math_count(inv):
n = 10**4
counter = 0
while n != 0:
invers = inv
count = 0
while invers > 0:
count += 1
random_digit = random.randint(1, 45)
if random_digit <= invers:
invers -= 1
counter += count
count = 0
if invers == 0:
n -= 1
invers = inv
return print(counter/10**4)
math_count(inv)
Jawaban
Kode tersebut sangat sulit untuk diikuti. Berikut adalah kemungkinan refactor untuk memperjelas maksudnya. Beberapa ide kunci dalam penyederhanaan: (1) menggunakan loop untuk mengelola penghitung daripada menambah / mengurangi secara manual; (2) menggunakan nama variabel yang lebih bermakna jika konteksnya tidak jelas; dan (3) mendelegasikan beberapa kompleksitas ke fungsi pembantu. Ide ketiga adalah yang paling berpengaruh: fungsi helper sederhana karena sangat sedikit; dan fungsi utamanya, setelah dibebaskan dari suatu beban, juga lebih sederhana - sangat sederhana, pada kenyataannya, yang bermuara pada penghitungan jumlah dalam dua putaran.
def math_count(inv, trials = 10000):
total_attempts = sum(
attempts_to_get_lte(x)
for _ in range(trials, 0, -1)
for x in range(inv, 0, -1)
)
return total_attempts / trials
def attempts_to_get_lte(x):
attempts = 0
while True:
attempts += 1
if random.randint(1, 45) <= x:
return attempts
Tetapi attempts_to_get_lte()merupakan masalah probabilitas yang mudah dipecahkan: daripada membuat Python mensimulasikan pembalikan koin secara manual, kita hanya dapat melakukan sedikit matematika. Jika Anda lebih suka pendekatan itu, saya yakin yang berikut ini benar (ahli probabilitas harus ikut campur jika saya tersesat):
def math_count_exact(inv):
return sum(45 / x for x in range(inv, 0, -1))