我在Python中有一个元组,有一些非零元素。
a=(2,2,4,2,0,0,8,8,8,8,8)
我想快速将元组作为列表返回,左边是零,但原始元素按顺序排列。到目前为止,我已经尝试了以下选项:
def squeeze(v):
v_filt=[x for x in v if x != 0]
return [0]*(len(v)-len(v_filt))+v_filt
def squeeze2(v):
return sorted(v, key=numpy.sign)
第一个选项稍微快一些,但是仍然需要0.866秒才能执行200000次长度为4的元组(在cProfile上)。我的测试用于元组,其中每个元素都可能为零。
有什么方法可以让这段代码运行得更快?理想情况下,我希望将其改进至少一到两个数量级。
答案 0 :(得分:2)
如果你已经使用numpy,你可以采取numpy进行掩蔽:
def squeeze(v):
c = v[v!=0]
return numpy.hstack([numpy.zeros(len(v)-len(c)),c])
编辑:由于Aशwiniचhaudhary
答案 1 :(得分:0)
def squeeze(v):
result = [None] * len(v)
i = 0
j = len(v)-1
for x in range(len(v)):
if v[len(v)-x-1] == 0:
result[i] = 0
i += 1
else:
result[j] = v[len(v)-x-1]
j -= 1
return result
import time
import random
a = [random.randint(0,10) for r in xrange(200000)]
start_time = time.time()
squeeze(a)
print time.time() - start_time, "seconds"
这需要0.340382099152秒