24
15

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 5 years have passed since last update.

リストの最大値(最小値)のindexを取得する6つの方法を計測してみた

Last updated at Posted at 2017-06-13

前述

リストの最大値(最小値)のindexを取得する

上記のうぜんさんの記事に記載されている5つの方法を計測してみました。
計測用コードについては処理にかかる時間を計測して表示を使用させていただきました。

追記

コメントにて指摘のあったnumpyでの処理も追加しました。
array→numpyの変換コストを除けば、圧倒的にnumpyが早い結果でした。
あまりにも早すぎたので、対象となる配列の要素数を1桁多くしました。

結果

  • list_name.index(max(list_name))
    • 0.027699708938598633[sec]
  • max(enumerate(list_name), key=lambda x: x[1])[0]
    • 0.15381669998168945[sec]
  • max(range(len(list_name)), key=lambda i: list_name[i])
    • 0.1455528736114502[sec]
  • max(enumerate(list_name), key=operator.itemgetter(1))[0]
    • 0.09561371803283691[sec]
  • max(zip(list_name, range(len(list_name))))[1]
    • 0.07018375396728516[sec]
  • [numpy変換処理込み] np_list_name.argmax()
    • 0.08819770812988281[sec]
  • [numpy変換処理抜き] np_list_name.argmax()
    • 0.0008273124694824219[sec]

実行結果、実装コード

出力結果(一部)


elapsed_time:0.027699708938598633[sec] 
elapsed_time:0.15381669998168945[sec] 
elapsed_time:0.1455528736114502[sec] 
elapsed_time:0.09561371803283691[sec] 
elapsed_time:0.07018375396728516[sec] 
elapsed_time:0.08819770812988281[sec] 
elapsed_time:0.0008273124694824219[sec] 
[244347, 674860, 655894, 255695, 678218, 531167, 17071, 288341, 429050, 146444, 291065, 27607, 556887, 298302, 515557, 271078, 883608, 9098, 752318, 276251, 349950, 133988, 955108, 322233, 613472, 844009, 298534, 485112, 106167, 516815, 865031, 286926, 413458, 883781, 910152, 942716, 913758, 853043, 377110, 527816, 478540, 920741, 770539, 169002, 820915, 231827, 423725, 673925, 182482, 14842, 515316, 999412, 152994, 986206, 851899, 403318, 137434, 163888, 46630, 347440, 920191, 506127, 935566, 981816, 353811, 196066, 106365, 739729, 62010, 426593, 

実装コード


import time
import random
import numpy as np

list_name = []
max_value = 1000000

for i in range(max_value ):
    list_name.append(random.randint(1,max_value))

start = time.time()
list_name.index(max(list_name))
elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

start = time.time()
max(enumerate(list_name), key=lambda x: x[1])[0]
elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

start = time.time()
max(range(len(list_name)), key=lambda i: list_name[i])
elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

import operator

start = time.time()
max(enumerate(list_name), key=operator.itemgetter(1))[0]
elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

start = time.time()
max(zip(list_name, range(len(list_name))))[1]
elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

# numpy (array→numpy変換処理込み)
start = time.time()
np_list_name = np.array(list_name)
np_list_name.argmax()
elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

# numpy (array→numpy変換処理抜き)
np_list_name2 = np.array(list_name)
start = time.time()
np_list_name2.argmax()
elapsed_time = time.time() - start
print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

print(list_name)

蛇足

ブログのコメントで伝えようとしたらコメント欄が見つかりませんでした。
届け、この思い。

そして一番結果の早いコードでも、とある問題が解決出来ず...もっと良い方法をご存知の方はぜひお教えください。
→解決しました!

24
15
2

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
24
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?