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には気をつけましょう!散歩でもマスク着用しましょう!

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

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

    以上でっす