【发布时间】:2018-10-11 16:44:45
【问题描述】:
我一直在尝试开发一种算法,称为尽快保持所需工具,但在模拟过程中,我意识到运行时间太长。
我想减少运行时间并检查其他关于如何快速 python 编码的问题Is Python slower than Java/C#? [closed] 我找到了几个解决方案,但我不知道如何在我的代码中实现它们。
在我的电脑上它需要 0.004999876022338867 秒,但主要问题是对于整个程序,这个函数被调用了 13,000 次。
这里附上我的全部代码,如果您有任何改进建议,请随时与我分享。
import sets
import numpy
import copy
import time
J= {1: [6, 7],2: [2, 3], 3: [1, 6, 9], 4: [1, 5, 9], 5: [5, 8, 10], 6: [1, 3, 6, 8], 7: [5, 6, 8, 9], 8: [5, 7, 8], 9: [1, 4, 5, 8], 10: [1, 2, 4, 10]}
def KTNS(sigma=[10, 9, 4, 1, 6, 3, 7, 5, 2, 8], Jobs=J, m=10 ,capacity=4 ):
t0=time.time()
Tools = {}
Lin={}
n=len(sigma)
for i in range(1,m+1):
for e in sigma:
if i in Jobs[e]:
Tools[i]=sets.Set([])
count = 1
available_tools=sets.Set()
for e in sigma:
for i in Jobs[e]:
Tools[i].add(count)
available_tools.add(i)
count+=1
Tin=copy.deepcopy(Tools)
for e in Tin:
Lin[e]=min(Tin[e])
count=1
J = numpy.array([0] *m)
W = numpy.array([[0] * m] * n)
while count<=len(sigma):
for e in Tools:
if len(available_tools)<capacity:
reference=len(available_tools)
else:
reference=capacity
while numpy.count_nonzero(J == 1) <reference:
min_value = min(Lin.itervalues())
min_keys = [k for k in Lin if Lin[k] == min_value]
temp = min_keys[0] #min(Lin, key=Lin.get)
if min_value>count:
if len(min_keys)>=2:
if count==1:
J[temp - 1] = 1
Lin[temp] = '-'
else:
J0=W[count-2]
k=0
for elements in min_keys: #tested
if numpy.count_nonzero(J == 1) < reference:
if J0[elements-1]==1:
J[elements-1]=1
Lin[elements]='-'
k=1
else:
pass
else:
pass
if k==0:
J[temp - 1] = 1
Lin[temp] = '-'
else:
J[temp - 1] = 1
Lin[temp] = '-'
else:
J[temp-1]=1
Lin[temp] = '-'
Tin[e].discard(count)
for element in Tin:
try:
Lin[element] = min(Tin[element])
except ValueError:
Tin[element]=sets.Set([len(sigma)+1])
Lin[element]=len(sigma)+1
W[count-1]=J
J= numpy.array([0] *m)
count+=1
Cost=0
for e in range(1,len(sigma)):
temp=W[e]-W[e-1]
temp[temp < 0] = 0
Cost+=sum(temp)
return Cost+capacity,time.time()-t0
【问题讨论】:
-
您是否真的希望有人检查您的代码,弄清楚它的作用并提出改进建议?
-
如果您想要对工作代码进行完整的代码审查,请尝试codereview.stackexchange.com - 但在发布之前请阅读帮助中心,以确保您的问题与主题相关!
-
详细解释您正在实施的算法也会有所帮助。
-
将时间乘以 13,000,我得到整个过程需要 65 秒。它应该花费的最长时间是多少?我确实同意 Blorgbeard 的观点——虽然很多人被错误地告知去 codereview,但你已经有了希望人们查看的功能齐全的代码。这个问题很适合那里,只要确保你提到它是在这里交叉发布的。 (这里不是离题,但在那里可能会更受欢迎,所以我不会投票结束。)
-
您应该为变量使用更好的命名约定,并且可能将此函数分解为许多较小的函数。实际上,要弄清楚这段代码的作用需要一段时间。
标签: python algorithm performance time