成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 列表去重的4種方式及性能對比

開發 后端
列表去重是Python中一種常見的處理方式,任何編程場景都可能會遇到需要列表去重的情況。列表去重的方式有很多,本文將一一講解他們,并進行性能的對比。

列表去重是Python中一種常見的處理方式,任何編程場景都可能會遇到需要列表去重的情況。

列表去重的方式有很多,本文將一一講解他們,并進行性能的對比。

[[350938]]

讓我們先制造一些簡單的數據,生成0到99的100萬個隨機數:

  1. from random import randrange 
  2. DUPLICATES = [randrange(100) for _ in range(1000000)] 

接下來嘗試這4種去重方式中最簡單直觀的方法:

1. 新建一個數組,遍歷原數組,如果值不在新數組里便加入到新數組中。

  1. # 第一種方式 
  2. def easy_way(): 
  3.     unique = [] 
  4.     for element in DUPLICATES: 
  5.         if element not in unique: 
  6.             unique.append(element) 
  7.     return unique 

進入ipython使用timeit計算其去重耗時:

  1. %timeit easy_way() 
  2. # 1.16 s ± 137 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

平均耗時在1.16秒左右,但是在這個例子中我們使用了數組作為存儲對象,實際上如果我們改成集合存儲去重后的結果,性能會快不少:

  1. def easy_way(): 
  2.     unique = set() 
  3.     for element in DUPLICATES: 
  4.         if element not in unique: 
  5.             unique.add(element) 
  6.     return unique 
  1. %timeit easy_way() 
  2. # 48.4 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 

平均耗時在48毫秒左右,改善明顯,這是因為集合和數組的內在數據結構完全不同,集合使用了哈希表,因此速度會比列表快許多,但缺點在于無序。

接下來看看第2種方式:

2. 直接對數組進行集合轉化,然后再轉回數組:

  1. # 第二種去重方式 
  2. def fast_way() 
  3.     return list(set(DUPLICATES)) 

耗時:

  1. %timeit fast_way() 
  2. # 14.2 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 100 loops each) 

平均耗時14毫秒,這種去重方式是最快的,但正如前面所說,集合是無序的,將數組轉為集合后再轉為列表,就失去了原有列表的順序。

如果現在有保留原數組順序的需要,那么這個方式是不可取的,怎么辦呢?

3. 保留原有數組順序的去重

使用dict.fromkeys()函數,可以保留原有數組的順序并去重:

  1. def save_order(): 
  2.     return list(dict.fromkeys(DUPLICATES)) 

當然,它會比單純用集合進行去重的方式耗時稍微久一點:

  1. %timeit save_order() 
  2. # 39.5 ms ± 8.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 

平均耗時在39.5毫秒,我認為這是可以接受的耗時,畢竟保留了原數組的順序。

但是,dict.fromkeys()僅在Python3.6及以上才支持。

如果你是Python3.6以下的版本,那么可能要考慮第四種方式了。

4. Python3.6以下的列表保留順序去重

在Python3.6以下,其實也存在fromkeys函數,只不過它由collections提供:

  1. from collections import OrderedDict 
  2. def save_order_below_py36(): 
  3.     return list(OrderedDict.fromkeys(DUPLICATES)) 

耗時:

  1. %timeit save_order_below_py36() 
  2. # 71.8 ms ± 16.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 

平均耗時在72毫秒左右,比 Python3.6 的內置dict.fromkeys()慢一些,因為OrderedDict是用純Python實現的。

【責任編輯:趙寧寧 TEL:(010)68476606】

 

責任編輯:趙寧寧 來源: Python實用寶典
相關推薦

2024-11-29 07:32:38

2015-05-04 14:50:48

PHPPHP生成隨機密碼

2017-02-08 12:00:45

PHP性能對比

2024-12-20 12:10:19

2019-12-25 09:53:01

虛擬機技術固態硬盤

2025-04-16 08:40:00

2018-03-01 15:20:59

iOS開發多線程

2010-03-15 14:01:26

JavaScript

2014-06-05 10:22:06

Tomcat 7

2024-10-07 08:40:56

Spring應用程序Java

2022-12-05 17:01:20

MySQL數據庫Oracle

2017-04-13 15:15:17

Netflix ZuuNginx性能

2024-04-24 11:24:43

C#數據去重

2024-10-09 11:31:51

2012-08-06 13:37:35

瀏覽器WindowsUbuntu

2009-07-24 13:17:43

世紀互聯至強CloudEx

2011-08-05 13:41:46

Go

2020-11-03 19:52:54

Java數組編程語言

2010-01-22 11:06:03

GNUkFreeBSDLinux

2016-05-25 10:03:51

JavaScript內存泄露
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区在线播放 | 国产精品一区二区三区在线 | 欧美福利视频 | 日韩一级免费观看 | 一区二区蜜桃 | japan25hdxxxx日本 做a的各种视频 | 国产欧美在线观看 | 91国内在线观看 | 久久精品a | 国产精品毛片无码 | 欧美a区| 国产欧美日韩综合精品一 | 久久久免费 | 蜜臀久久99精品久久久久野外 | 欧美精品久久久 | 免费在线观看黄视频 | 欧美一区二区三区 | 999精品视频| 国产美女在线播放 | 欧美成人精品激情在线观看 | 黄色精品 | 欧美视频免费在线观看 | 国产一级久久久久 | 亚洲免费精品 | 中文字幕在线免费观看 | 久久久久国 | 日韩av在线免费 | 婷婷午夜天 | 成人av资源在线 | 精品成人佐山爱一区二区 | 91中文字幕在线观看 | 成人午夜免费福利视频 | 午夜影视免费片在线观看 | 成人精品鲁一区一区二区 | 午夜视频在线免费观看 | 日韩精品一区二 | 久久只有精品 | 99久久精品国产一区二区三区 | 中文欧美日韩 | 精品欧美二区 | 国产一区二区在线免费播放 |