[過去ログ] Qiita 5 - キータぞ、来たぞ、キータだぞー (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
778
(2): デフォルトの名無しさん [] 2024/11/22(金) 00:44:12.61 ID:iUXVzsPN(1/3) AAS
先生の昔の記事

ZEAM開発ログ番外編: Elixir で再帰とStreamのどちらが速いのか,素因数分解で比較してみた
外部リンク:qiita.com
> @zacky1972 による Stream 版その1で,次のような方針を採っています。
> 最初にエラトステネスの篩(sieve)により素数を生成。ただし最初から2と奇数に絞っている。

> def sieve(seq) do
> Stream.unfold(seq, fn s ->
> p = s |> Enum.at(0)
> next = s |> Stream.filter(fn x -> rem(x, p) != 0 end)
> {p, next}
> end)
> end

> 素数の無限数列を生成するために,エラトステネスの篩 (sieve) は @naoya@github さんの「無限リストによるエラトステネスのふるい」を採用しました。

「先生!エラトステネスの篩には剰余計算要らないんですよ」って誰か言ってやらんのか?
Elixir界隈は馬鹿の連鎖が深刻だな。
786: デフォルトの名無しさん [sage] 2024/11/22(金) 11:37:35.39 ID:iUXVzsPN(2/3) AAS
>>778の先生の昔の記事あらためて見直してみたんだが

> 実行結果
> iMac Pro (2017) にてベンチマーク Fact.all_benchmarks を実行してみました。

> CPUとGPUは最高性能の構成,メモリとSSDは標準構成です。

> $ mix run -e "Fact.all_benchmarks"
> Elixir.Fact.FactRecursive1: factorization using recursive calls in compress and factor
> 0.000005 sec.
> Elixir.Fact.FactRecursive2: factorization using recursive calls in factor and Enum in compress
> 0.001167 sec.
> Elixir.Fact.FactStream1: factorization using Stream that generates every prime numbers while half of the target number without dividing the target number
> 2.336041 sec.
> Elixir.Fact.FactStream2: factorization using Stream that generates numbers while half of the target number and filter by sieve without dividing the target number
> 0.000391 sec.
> Elixir.Fact.FactStream3: factorization using Stream that generates numbers while half of the target number or that divided by founded factor
> 0.000201 sec.

> FactRecursive1 ぶっちぎりです。やはり全て再帰呼び出しで書いた方がパフォーマンスは良くなります。

最速と最遅で46万倍違うんだがElixirってたかだか11111の素因数分解するのに記述の違いでこんなに差が出るのか?
ちょっと信じられん。
787: デフォルトの名無しさん [sage] 2024/11/22(金) 11:48:58.85 ID:iUXVzsPN(3/3) AAS
遅いと評判の言語であるPythonで11111の素因数分解を2から試し割りするだけの何の工夫もないコードで試してみた。

def factorization(n):
  f = []
  i = 2
  while i * i <= n:
    while n % i == 0:
      f.append(i)
      n //= i
    i += 1
  if n > 1:
    f.append(n)
  return f

import timeit
n = 10000
print(f'{timeit.timeit('factorization(11_111)', globals = globals(), number = n) / n:.8f}')

外部リンク:wandbox.org
> 0.00000241

先生が「ぶっちぎりです。やはり全て再帰呼び出しで書いた方がパフォーマンスは良くなります。」と言ってるElixirのコードより遅いと評判のPythonのが倍くらい速いんだが?

ちょっと信じられんのだが、俺か先生のどちらかあるいは両方に誤解があるとしか思えん。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.040s