blog.takurinton.dev

GWの過ごし方

2020-05-01

どうも

皆さん、コロナですがどうお過ごしでしょうか?僕はとっても暇です(ほんとは暇ではないのですがそこは割愛)

まあ、今日はほんとに暑くて、気温が23度もあったらしくて、そんなことどうでもいいので本題に移りましょう。

散歩をしてきた

私は散歩がとっても好きで、音楽を爆音で流しながら散歩をします。 そこで、ふと思いついた、大学1年生の時Javaで素数の列挙書いたなあ、でも汚いコードだったなあ ということで、散歩中に素数の列挙のプログラムを少し考えながら歩いて、帰宅して20分くらいで実装して、今記事を書いてるって感じです。

実装していく

まあ、実装したと言っても、大した内容ではないのですが、簡単に関数を4つほど定義して、並列で回して勝負させます。

##メンバー紹介

  • エントリーナンバー1:シンプルなループの関数
  • エントリーナンバー2:エラトステネスのふるいのアルゴリズム
  • エントリーナンバー3:sympyライブラリ
  • エントリーナンバー4:組み込み関数all でっす!
import threading 
import time
from sympy import sieve

#一番普通のやつ、1年生の時書いたのもこのパターン
def type_1_prime_number_function(n):
    prime_number_list = [i for i in range(2, n)]
    start = time.time()
    for i in prime_number_list:
        boolean = True
        for j in range(2, i):
            if i % j == 0:
                boolean = False
        
        if boolean:
            prime_number_list.append(i)

    end = time.time()
    print('simple:{}'.format(end-start))



# これは偉い人が生み出した偉い法則、すごい
def type_2_prime_number_function(n):
    start = time.time()

    prime_number_list = [i for i in range(2, n)]
    
    max_number = int(prime_number_list[-1]**.5)
    for i in range(2, max_number):
        prime_number_list = [j for j in prime_number_list if j % i != 0 or j == i]

    end = time.time()
    print('Eratosthenes:{}'.format(end-start))



# これはライブラリ、これも速そう
def type_3_prime_number_function(n):
    start = time.time()

    prime_number_list = [i for i in sieve.primerange(2, n)]

    end = time.time()
    print('sympy:{}'.format(end-start))



# allとanyはaから始まるからドキュメントの先頭にくるし
#知らない人なんていないよね?(煽り)
def type_4_prime_number_function(n):
    start = time.time()
    prime_number_list = [2]
    for i in range(3, n, 2): 
        if all(i % j != 0 for j in prime_number_list):
            prime_number_list.append(i)
    
    end = time.time()
    print('Python_all_function:{}'.format(end-start))



if __name__ == '__main__':
    thread1 = threading.Thread(target=type_1_prime_number_function, args=(10000, ))
    thread2 = threading.Thread(target=type_2_prime_number_function, args=(10000, ))
    thread3 = threading.Thread(target=type_3_prime_number_function, args=(10000, ))
    thread4 = threading.Thread(target=type_4_prime_number_function, args=(10000, ))

    thread1.start()
    thread2.start()
    thread3.start()
    thread4.start()

今回はこの4つの関数で2から10000までの素数を列挙していきまっす! あと、全部printしてると見にくいから、時間だけprintしていきまっす!

結果

>>> python prime.py
sympy:0.0028688907623291016
Eratosthenes:0.018374919891357422
Python_all_function:0.10846400260925293

(ソースコードの部分の色がカッコよくない、、、、まあいいや)

見づらいですが、1回勝負だと 1位→ライブラリ 2位→エラトステネス 3位→all関数 途中棄権→シンプルなやつ

てな感じになりました! ライブラリ速い ※大学3年生にもなって素数なんて書いてんなよって思った人は、ツイッターでリプください

最後に

皆さん、COVID-19には気をつけましょう!散歩でもマスク着用しましょう!

おいおいこっちの方が速いだろってやつあったら教えてください!

最後に大事なことだけど、レベル低いコード書いて自己満足入ってるようなやつは死ぬ

以上でっす