Я написал этот код Python для выполнения определенного вычисления в более крупном проекте и отлично работает для меньших значений N
, но он не очень хорошо масштабируется для больших значений, и хотя я побежал в течение нескольких часов, чтобы собрать данные, мне было интересно, если есть способ, чтобы ускорить этотУскорение этого кода на Python для большого ввода
import numpy as np
def FillArray(arr):
while(0 in arr):
ind1 = np.random.randint(0,N)
if(arr[ind1]==0):
if(ind1==0):
arr[ind1] = 1
arr[ind1+1] = 2
elif(ind1==len(arr)-1):
arr[ind1] = 1
arr[ind1-1] = 2
else:
arr[ind1] = 1
arr[ind1+1] = 2
arr[ind1-1] = 2
else:
continue
return arr
N=50000
dist = []
for i in range(1000):
arr = [0 for x in range(N)]
dist.append(Fillarr(arr).count(2))
для N = 50,000
, в настоящее время он занимает чуть больше минуты на моем компьютере, на одной итерации для заполнения массив. Поэтому, если я хочу имитировать это, скажем, 1000 раз, это занимает много часов. Есть ли что-то, что я могу сделать, чтобы ускорить это?
Редактировать 1: Я забыл упомянуть, что он на самом деле делает. У меня есть список длины N
, и я инициализирую его, имея нули в каждой записи. Затем я выбираю случайное число между 0
и N
, и если этот индекс списка имеет нуль, я заменяю его на 1
и его соседние индексы на 2
, чтобы указать, что они не заполнены 1
, но они не могут быть заполнены снова. Я продолжаю делать это, пока я не заполнил весь список 1
и 2
, а затем подсчитаю, сколько записей содержит 2
, что является результатом этого вычисления. Таким образом, я хочу узнать, если я случайно заполняю массив этим ограничением, сколько записей не будет заполнено.
Очевидно, я не утверждаю, что это самый эффективный способ найти этот номер, поэтому я надеюсь, что, возможно, есть лучший альтернативный способ, если этот код не ускорится.
И что он должен делать? Насколько я могу судить, в то время как у вас есть 0 в вашем массиве, вы производите случайный индекс _ в надежде, что индекс индекса 0 изменит его на что-то еще. Очевидно, что это не очень хорошо масштабируется ... –
@SylvainLeroux Извините, что забыл дать объяснение тому, что я делаю в коде. Я объяснил это в редакции 1 – Bilentor