Pythonの集合生成のパフォーマンス比較 – set() vs. {} literal

Python performance comparison for creating sets – set() vs. {} literal – StackOverflow

この説明はなんだかちょっとしっくりこない.もっと単純に,これは単にイテレータとジェネレータの違い,内包表記による中間処理による効率の差を表しているだけじゃないのか.なので,setの話だけではなくて,全てに於いて云える話だと思う.

%timeit tuple(i for i in range(100000))
%timeit set(tuple(i for i in range(100000)))
%timeit set(tuple(range(100000)))
print('------')
tpl = tuple(range(100000))
%timeit tuple(range(100000))
%timeit set(tpl)
print('------')
%timeit set(i for i in range(100000))
%timeit {i for i in range(100000)}
%timeit {*range(100000)}
%timeit set(range(100000))
100 loops, best of 3: 10.1 ms per loop
100 loops, best of 3: 14.6 ms per loop
100 loops, best of 3: 7.5 ms per loop
------
100 loops, best of 3: 3.24 ms per loop
100 loops, best of 3: 3.57 ms per loop
------
100 loops, best of 3: 12 ms per loop
100 loops, best of 3: 8.73 ms per loop
100 loops, best of 3: 6.13 ms per loop
100 loops, best of 3: 5.96 ms per loop

「{*range(100000)}」と「set(range(100000))」について,コメント欄で言及されているが,グラフにすれば明らかで,有意差はない.経験的には「sequence unpacking」の方がvolatile(速い時もあれば,遅い時もある)印象だが,以下の通りまあこれといった差はみられない事が分かる.なので,やっぱりこれは単純な話だと思うな.

import time
import seaborn as sns


res1, res2 = [], []
for i in range(10000):
    start = time.perf_counter()
    {*range(100000)}
    end = time.perf_counter()
    res1.append(end-start)
      
    start = time.perf_counter()
    set(range(100000))
    end = time.perf_counter()
    res2.append(end-start)

ax = sns.boxplot(data=[res1, res2], showmeans=True)
ax.set_xticklabels(['{*range(100000)}', 'set(range(100000))'])
ax.set_ylabel('Time [sec]')

nQAAAAASUVORK5CYII

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください