質問: [x,y,z] そして、各粒子について、私は隣人が存在するかどうかを各粒子の位置を次のように検索することによってテストします。if [x+1,y,z] in particles.location "find the identity of this neighbour particle in x:the particle's index in the array" particles.index([x+1,y,z])
回答: 他の人が述べたように、inは大きなリストではとても遅くなる可能性があります。 in、set、およびbisectのパフォーマンスの比較をいくつか示します。時間(秒)は対数スケールです。 テスト用のコードimport random import bisect import matplotlib.pyplot as plt import math import time def method_in(a,b,c): start_time = time.time() for i,x in enumerate(a): if x in b: c[i] = 1 return(time.time()-start_time) def method_set_in(a,b,c): start_time = time.time() s = set(b) for i,x in enumerate(a): if x in s: c[i] = 1 return(time.time()-start_time) def method_bisect(a,b,c): start_time = time.time() b.sort() for i,x in enumerate(a): index = bisect.bisect_left(b,x) if index < len(a): if x == b[index]: c[i] = 1 return(time.time()-start_time) def profile(): time_method_in = [] time_method_set_in = [] time_method_bisect = [] nls = [x for x in range(1000,20000,1000)] for n in nls: a = [x for x in range(0,n)] random.shuffle(a) b = [x for x in range(0,n)] random.shuffle(b) c = [0 for x in range(0,n)] time_method_in.append(math.log(method_in(a,b,c))) time_method_set_in.append(math.log(method_set_in(a,b,c))) time_method_bisect.append(math.log(method_bisect(a,b,c))) plt.plot(nls,time_method_in,marker='o',color='r',linestyle='-',label='in') plt.plot(nls,time_method_set_in,marker='o',color='b',linestyle='-',label='set') plt.plot(nls,time_method_bisect,marker='o',color='g',linestyle='-',label='bisect') plt.xlabel('list size', fontsize=18) plt.ylabel('log(time)', fontsize=18) plt.legend(loc = 'upper left') plt.show()