一个快速排列成两个数组的数组。蟒蛇

时间:2017-09-06 08:19:21

标签: python

如果对象具有'confirmation'参数,我想将数组拆分为两个数组。有没有比我使用简单的循环更快的方法。该数组有很多元素。我对性能表示担忧。

[
    {
      'id':'1'
    },
    {
      'id':'2'
    },
    {
      'id':'3',
      'confirmation':'20',
    },
    {
      'id':'4',
      'confirmation':'10',
    }
]

[{'id': 3, 'confirmation': 20}, {'id': 4, 'confirmation': 10}]

[{'id': 1}, {'id': 2}]

使用for循环实现

$ python3
Python 3.4.3 (default, Nov 17 2016, 01:08:31) 

dict1 = {"id":1}
dict2 = {"id":2}
dict3 = {"id":3, "confirmation":20}
dict4 = {"id":4, "confirmation":10}
list = [dict1, dict2, dict3, dict4]

list_with_confirmation = []
list_without_confirmation = []
for d in list:
  if 'confirmation' in d:
    list_with_confirmation.append(d)
  else:
    list_without_confirmation.append(d)

print(list_with_confirmation)
print(list_without_confirmation)

更新1

这是我们真实数据的结果。 (3)是最快的。

(1)0.148394346

(2)0.105772018

(3)0.0339076519

_list = search()

logger.warning(time.time()) //1504691716.5748231

list_with_confirmation = []
list_without_confirmation = []
for d in _list:
  if 'confirmation' in d:
    list_with_confirmation.append(d)
  else:
    list_without_confirmation.append(d)

logger.warning(len(list_with_confirmation)) // 69427
logger.warning(time.time()) // 1504691716.7232175 (0.148394346) --- (1)

list_with_confirmation = [d for d in _list if 'confirmation' in d]
list_without_confirmation = [d for d in _list if not 'confirmation' in d]

logger.warning(len(list_with_confirmation)) // 69427
logger.warning(time.time()) // 1504691716.8289895 (0.105772018) --- (2)

lists = ([], [])
[lists['confirmation' in d].append(d) for d in _list]

logger.warning(len(lists[1])) // 69427
logger.warning(time.time()) // 1504691716.8628972 (0.0339076519) --- (3)

我不知道如何在我的环境中使用timeit。对不起,这是一个糟糕的替补检查..

3 个答案:

答案 0 :(得分:2)

列表理解可能会稍快一些:

list_with_confirmation = [d for d in list if "confirmation" in d]
list_without_confirmation = [d for d in list if "confirmation" not in d]

请参阅Why is list comprehension so faster?

答案 1 :(得分:1)

可能 是最快的方式,但你可以尝试另一种方法:

lists = ([], [])
for d in source_list: 
    lists['confirmation' in d].append(d)

甚至:

lists = ([], [])
[lists['confirmation' in d].append(d) for d in source_list]

这种方式lists[0]将是"没有确认"并且lists[1]将是"确认"。做自己的基准测试。

附注:不要使用list作为列表名称,因为它会覆盖列表构造函数。

答案 2 :(得分:1)

如果您执行以下代码:

dict1 = {"id":1}
dict2 = {"id":2}
dict3 = {"id":3, "confirmation":20}
dict4 = {"id":4, "confirmation":10}
_list = [dict1, dict2, dict3, dict4]

import timeit
def fun(_list):
        list_with_confirmation = []
        list_without_confirmation = []
        for d in _list:
          if 'confirmation' in d:
            list_with_confirmation.append(d)
          else:
            list_without_confirmation.append(d)

        print(list_with_confirmation)
        print(list_without_confirmation)


def my_fun(_list):
        list_with_confirmation = [d for d in _list if 'confirmation' in d]
        list_without_confirmation = [d for d in _list if not 'confirmation' in d]
        print(list_with_confirmation)
        print(list_without_confirmation)


if __name__ == '__main__':
    print(timeit.timeit("fun(_list)", setup="from __main__ import fun, _list",number=1))
    print(timeit.timeit("my_fun(_list)", setup="from __main__ import my_fun, _list",number=1))

您可以获得以下统计信息:

[{'confirmation': 20, 'id': 3}, {'confirmation': 10, 'id': 4}]
[{'id': 1}, {'id': 2}]
5.41210174561e-05
[{'confirmation': 20, 'id': 3}, {'confirmation': 10, 'id': 4}]
[{'id': 1}, {'id': 2}]
2.40802764893e-05

哪种意思是列表综合是最优化的方式,您可以看到更多参考:blog