GWの過ごし方
2020-05-01
どうも
皆さん、コロナですがどうお過ごしでしょうか?僕はとっても暇です(ほんとは暇ではないのですがそこは割愛)
まあ、今日はほんとに暑くて、気温が23度もあったらしくて、そんなことどうでもいいので本題に移りましょう。
散歩をしてきた
私は散歩がとっても好きで、音楽を爆音で流しながら散歩をします。
そこで、ふと思いついた、大学1年生の時Javaで素数の列挙書いたなあ、でも汚いコードだったなあ
ということで、散歩中に素数の列挙のプログラムを少し考えながら歩いて、帰宅して20分くらいで実装して、今記事を書いてるって感じです。
実装していく
まあ、実装したと言っても、大した内容ではないのですが、簡単に関数を4つほど定義して、並列で回して勝負させます。
メンバー紹介
でっす!
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には気をつけましょう!散歩でもマスク着用しましょう!
おいおいこっちの方が速いだろってやつあったら教えてください!
最後に大事なことだけど、レベル低いコード書いて自己満足入ってるようなやつは死ぬ
以上でっす