1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python 基本操作 第1弾:リスト内包表記

Last updated at Posted at 2020-12-13

#Python 基本操作<リスト内包表記>#

##はじめに
自分が不安な部分についてのみ,Pythonの基本操作について復習する.
その第1弾としてリスト内包表記について記述する.

##なぜリスト内包表記が必要なのか?
・処理の高速化
・構造の単純化
主には,これらの利点が得られることがあるためである
ここでは,その記述方法と評価について行う

##記述方法1
#####大括弧[ ]内で処理内容を格納する変数とその処理を並べる
[変数 処理]
例)
data = [i for i in range (10)]

##記述方法2
#####大括弧[ ]内で処理内容を格納する変数とその処理及び実行条件を並べる
[変数 処理 条件]
例)
data = [i for i in range (10) if i%2 == 0]

##記述方法3
#####if~ else...のように条件を満たさない時の処理が必要な時,条件を間に並べる
[変数 条件 処理]
例)
data = [i if i%2 == 0 else 0 for i in range (10)]

##コード

List_Comprehension.py
"""
2020/12/13
@Yuya Shimizu

リスト内包表記
"""
#記述方法1:[変数 処理]
data = [i for i in range(10)]
print(data)

#記述方法2:[変数 処理 条件]
data = [x for x in range(10) if x%2 == 0]
print(data)

#記述方法3:[変数 条件 処理]
data = [y if y%2 == 0 else "xxx" for y in range(10)]
print(data)

##本当に高速化できているのか?
確かに,構造としては1行で単純化できていると思う.
しかし,本当に高速化できているのか?
以下では,その検証をtimeモジュールを用いて行う.
繰り返し数が小さいと違いが分かりにくかったため,
繰り返し数1000, 2000, 3000, 4000, 5000の5条件において検証した.

##コード

List_Comprehension.py
"""
2020/12/13
@Yuya Shimizu

リスト内包表記
"""
iteration = 1000 #繰り返し条件{1000,2000,3000,4000,5000}
def func1():
    #[変数 処理]
    data = []
    for i in range(iteration):
        data.append(i)
    print(data)

    #[変数 処理 条件]
    data = []
    for x in range(iteration):
        if x%2 == 0:
            data.append(x)
    print(data)

    #[変数 条件 処理]
    data = []
    for y in range(iteration):
        if y%2 == 0:
            data.append(y)
        else:
            data.append("xxx")
    print(data)

def func2():
    #[変数 処理]
    data = [i for i in range(iteration)]
    print(data)

    #[変数 処理 条件]
    data = [x for x in range(iteration) if x%2 == 0]
    print(data)

    #[変数 条件 処理]
    data = [y if y%2 == 0 else "xxx" for y in range(iteration)]
    print(data)


###### 実行時間計測
import time

start1 = time.time()
func1()
process_time1 = time.time() - start1

start2 = time.time()
func2()
process_time2 = time.time() - start2

print("リスト内包表記(iteration={})----なし:{}秒,あり:{}秒".format(iteration, process_time1, process_time2))

##検証結果
|繰り返し数[回]|リスト内包表記のなしの実行時間[s]|リスト内包表記のありの実行時間[s]|
|:-:|:-:|:-:|:-:|
|1000|1.139344|1.121223|
|2000|1.026536|0.578534|
|3000|0.856933|0.884612|
|4000|0.766533|0.579598|
|5000|0.667517|0.605027|

2000回と4000回のときには確かに高速化が見られるが,必ずしも高速化できるというわけではなく,
高速化できる場合があることが分かる.実際に,よく見ると試行回数3000回においては,むしろリスト内包表記を用いた方が遅いという結果となっている.

##感想
検証結果では,必ずしも高速化できるというわけではないが,可能性はあり,遅くなってもわずかであるならば,活用した方がよいのかと思った.それに,構造が単純化できることはデバッグなどの際にも都合がよいのではないかと思う.使える場面があれば,ぜひリスト内包表記を使いたいと思う.

##参考文献
Pythonで始めるアルゴリズム入門 伝統的なアルゴリズムで学ぶ定石と計算量
                         増井 敏克 著  翔泳社

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?