文字列の長いリストで検索を最適化する

N08

私は次のMWEを持っています。ここでは、リスト内包表記を使用して、リストls内に含まれている文字列を検索しますstrings

import numpy as np

strings = ["ASD", "DSA", "ABC", "ABQ"]
ls     = np.asarray(["ASD", "DSA", "ASD", "ABC", "ABQ","ASD", "DSA", "ASD", "ABC", "ABQ","ASD", "DSA", "ASD", "ABC", "ABQ"])

for string in strings:
    print(len(ls[[string in s for s in ls]]))  

これは意図したとおりに機能しlsますが、問題は、私のリストが非常に長く(10 ^ 9エントリ)、リストの理解にかなりの時間がかかることです。

上記のコードを最適化する方法はありますか?


編集:私は個々の発生、すなわち6、3、3、3を記録することを可能にする解決策を探しています

ラルフ

この投稿で提案されたアイデアを使用することをお勧めします; 最善のアプローチはを使用することcollections.Counterです。

これにより、Counter1回のビルドが行われ、カウントする個々の要素を簡単に検索できます。

これは次のようになります。

import collections
import numpy as np
import timeit

def _get_data(as_numpy):
    data = []
    for _ in range(10**6):
        data.extend(["ASD", "DSA", "ASD", "ABC", "ABQ"])

    if as_numpy:
        data = np.asarray(data)

    return data

def f1(data):
    search_list = ["ASD", "DSA", "ABC", "ABQ"]
    result_list = []

    for search_str in search_list:
        result_list.append(
            len(data[[search_str in s for s in data]]))

    return result_list

def f2(data):
    search_list = ["ASD", "DSA", "ABC", "ABQ"]
    result_list = []

    c = collections.Counter(data)
    for search_str in search_list:
        result_list.append(
            c[search_str])

    return result_list

def f3(data):
    search_list = ["ASD", "DSA", "ABC", "ABQ"]
    result_list = []

    c = collections.Counter(data)
    for search_str in search_list:
        result_list.append(
            data.count(search_str))

    return result_list

def f4(data):
    # suggestion by user 'nixon' in another answer to this question
    search_list = ["ASD", "DSA", "ABC", "ABQ"]

    l, counts = np.unique(data, return_counts=True)
    # 'l' and 'counts' are in different order than 'search_list'
    result_list = [
        counts[np.where(l == search_str)[0][0]]
        for search_str in search_list]

    return result_list

これらのアプローチで同じ結果が得られるようにするには、次のようにします。

data1 = _get_data(as_numpy=True)
data2 = _get_data(as_numpy=False)
assert f1(data1) == f2(data2) == f3(data2) == f4(data1)

そして、タイミングを比較すると、次のようになります。

print(timeit.timeit(
    'f(data)',
    'from __main__ import f1 as f, _get_data; data = _get_data(as_numpy=True)',
    number=10))
print(timeit.timeit(
    'f(data)',
    'from __main__ import f2 as f, _get_data; data = _get_data(as_numpy=False)',
    number=10))
print(timeit.timeit(
    'f(data)',
    'from __main__ import f3 as f, _get_data; data = _get_data(as_numpy=False)',
    number=10))
print(timeit.timeit(
    'f(data)',
    'from __main__ import f4 as f, _get_data; data = _get_data(as_numpy=True)',
    number=10))

# f1 48.2 sec
# f2  1.7 sec
# f3  3.8 sec
# f4  9.7 sec

ご覧のとおり、時差には大きさの順序があります。

それはあなたの場合にうまくいきますか?


編集:numpy.uniqueこの質問への別の回答で@nixonによって提案されたものと同様の、を使用したアプローチを追加しましたそれでも、を使用するよりも遅いようcollections.Counterです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Postgresで部分文字列検索のクエリを最適化する方法は?

分類Dev

パターンの長いリストを文字列で検索する方法

分類Dev

テキストを検索するクエリの最適化

分類Dev

文字列で最長の繰り返し文字を検索する

分類Dev

文字列の文字列リストで文字列を検索する

分類Dev

文字列の非常に長いリストの適切な検索/取得方法は何ですか?

分類Dev

文字列内のN番目の文字の検索を最適化する

分類Dev

BASHスクリプトでファイル内のテキストを検索/検索するための最良の/最適化された方法

分類Dev

リストのリストで文字列を検索する

分類Dev

Ruby-文字列内で最長の回文部分文字列を検索する

分類Dev

バイナリ文字列で最長の正の部分文字列を検索する

分類Dev

2つの文字列のキーワードの検索を最適化する

分類Dev

可変長のビット文字列のバイナリデータを検索するのに最適な方法は?

分類Dev

PHP-配列内の最も近いポイントの検索を最適化する

分類Dev

文字列で始まる要素をリストで検索する最も速い方法は?

分類Dev

配列内で最長の文字列を検索します

分類Dev

文字列のリストで整数を検索する

分類Dev

文字列内の最長の単語を検索する

分類Dev

文字列内の最長の単語を検索する

分類Dev

文字のリストで最長の部分文字列を印刷する

分類Dev

文字列のネストされたリストで最も長い文字列の長さを取得するにはどうすればよいですか?

分類Dev

文字列のリストでスーパー文字列を検索する-POSTGRES

分類Dev

オブジェクトの配列の検索を最適化する

分類Dev

長い文字列内の特定の文字列セットを見つけて置き換えるための最適化された方法は何ですか?

分類Dev

文字列の名前で文字列のリストを検索する

分類Dev

ソートされていない配列の検索を最適化する方法は?

分類Dev

リストで最も長い文字列を選択するPythonの最も効率的な方法は?

分類Dev

アルファベット順で最長の部分文字列を検索する

分類Dev

Pythonのリスト内で最長および最短のリストを検索する

Related 関連記事

  1. 1

    Postgresで部分文字列検索のクエリを最適化する方法は?

  2. 2

    パターンの長いリストを文字列で検索する方法

  3. 3

    テキストを検索するクエリの最適化

  4. 4

    文字列で最長の繰り返し文字を検索する

  5. 5

    文字列の文字列リストで文字列を検索する

  6. 6

    文字列の非常に長いリストの適切な検索/取得方法は何ですか?

  7. 7

    文字列内のN番目の文字の検索を最適化する

  8. 8

    BASHスクリプトでファイル内のテキストを検索/検索するための最良の/最適化された方法

  9. 9

    リストのリストで文字列を検索する

  10. 10

    Ruby-文字列内で最長の回文部分文字列を検索する

  11. 11

    バイナリ文字列で最長の正の部分文字列を検索する

  12. 12

    2つの文字列のキーワードの検索を最適化する

  13. 13

    可変長のビット文字列のバイナリデータを検索するのに最適な方法は?

  14. 14

    PHP-配列内の最も近いポイントの検索を最適化する

  15. 15

    文字列で始まる要素をリストで検索する最も速い方法は?

  16. 16

    配列内で最長の文字列を検索します

  17. 17

    文字列のリストで整数を検索する

  18. 18

    文字列内の最長の単語を検索する

  19. 19

    文字列内の最長の単語を検索する

  20. 20

    文字のリストで最長の部分文字列を印刷する

  21. 21

    文字列のネストされたリストで最も長い文字列の長さを取得するにはどうすればよいですか?

  22. 22

    文字列のリストでスーパー文字列を検索する-POSTGRES

  23. 23

    オブジェクトの配列の検索を最適化する

  24. 24

    長い文字列内の特定の文字列セットを見つけて置き換えるための最適化された方法は何ですか?

  25. 25

    文字列の名前で文字列のリストを検索する

  26. 26

    ソートされていない配列の検索を最適化する方法は?

  27. 27

    リストで最も長い文字列を選択するPythonの最も効率的な方法は?

  28. 28

    アルファベット順で最長の部分文字列を検索する

  29. 29

    Pythonのリスト内で最長および最短のリストを検索する

ホットタグ

アーカイブ