将非零元素挤压到右边

时间:2014-04-26 11:57:21

标签: python python-2.7 optimization

我在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上)。我的测试用于元组,其中每个元素都可能为零。

有什么方法可以让这段代码运行得更快?理想情况下,我希望将其改进至少一到两个数量级。

2 个答案:

答案 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秒