Cucco’s Compute Hack

コンピュータ関係の記事を書いていきます。

順位を教えてくれる関数

順位を教えてくれる関数。
データ件数に対してn^2で計算時間がかかるようなので、大きな配列への適用は難しい。

自前環境での計算時間は大体以下の通り。
# 10000個で、0.2秒
# 20000個で、0.7秒
# 30000個で、1.5秒
# 40000個で、2.7秒

プログラム

import numpy as np
import random
import time

# 1次元配列を渡したら、その配列の中での大きい順(一番大きな値に対しては1)を返してくれる関数。
#
# 10000個で、0.2秒
# 20000個で、0.7秒
# 30000個で、1.5秒
# 40000個で、2.7秒


def calc_rank(data):
    np_data = np.array(data)
    rank = [None]*len(data)

    for index, value in enumerate(data):
        rank[index] = np.sum(np_data >= value)

    return rank


def rand_list(length):
    rl = [None]*length

    for index in range(length):
        rl[index] = random.randrange(0, length*2)

    return rl


if __name__ == "__main__":
    # data=[0,12,53,9,31,78,40,87,84,55,20,77]
    length = 1000
    data = rand_list(length)

    tic = time.time()

    rank = calc_rank(data)

    toc = time.time()
    print("データ件数", length)
    print("計算時間(秒)", toc-tic)

    print("計算結果抜粋")
    for i in range(len(data)):
        print("{0} {1}".format(data[i], rank[i]))
        if i > 5:
            break  # 印字は邪魔なので適当にbreak

実行結果

データ件数 12
計算時間(秒) 0.0
計算結果抜粋
0 12
12 10
53 6
9 11
31 8
78 3
40 7
87 1
84 2
55 5
20 9
77 4