インターネット老人おぢさん

プロでも少ない競技プログラミングの世界へ入門しよう!スクールを卒業したらPythonを学んで脱中級者を目指す

最終更新:2021年01月28日 12時20分62秒(初公開:2021年01月28日 12時20分62秒

プロでも少ない競技プログラミングの世界へ入門しよう!スクールを卒業したらPythonを学んで脱中級者を目指す

技術屋なら当然、競技プログラミングはやるよね!

という圧を感じながら生きてます、のむらやです。
速さを意識することはあれど、マグロみたいに早く動き続けないと身の危険を感じる生活はしていないので、動作速度<可読性<実装速度みたいな生活をしていますが、世の中には黒魔術を使ったり(やむを得ず)マグログラマーのような人もいるのです。
今の御時世、メモリは潤沢にあるし悪魔の激遅スクリプト言語Pythonくんが市民権を得る時代ですし、ファミリーコンピューターでピコピコ8bitですげーキレイ!って言ってたオッサンですら「昔はこうだった」トークをしたくなるぐらいには資源に恵まれています。

が、一方で激重プロジェクト(大体AIブン回したりなんか掘ってたりします)もあるので、やはり高速化・軽量化技術は大事だと思うのです。
特にフロントエンジニアをやるなら、128kbpsの制限を食らった状態でも快適に使えるサービスを提供する努力を惜しんではいけないと思います。

高速化?並列化?軽量化?

どれも「プログラムを早くしたい」という思いに溢れたキーワードたちです。
私もサイトを爆速にするため、JavaやPHPやRubyを捨てた身です。
なんなら、Javascriptが一番重いとさえ思っています。このページはReactJS(Javascript)で書いてますが、生成したファイルはHTMLで、皆さんはHTMLファイル(とCSSファイル)しか読んでいないので、サイトの表示速度は相当早いはずです。
WordPressよりは確実に早いでしょう。
もしJAMStack構成の本サイトよりも爆速なWordPressのサイトがあれば、サーバースペックを相当積んでないとできないです。

高速化を考える

まず真っ先に思いつくのは、先述した通りサーバースペックを上げる事です。
マシンパワーを増やしてCPUをクロックアップしてバシバシトラフィックを捌けば理論上早くなります。

が、無料でサイトホスティングをしたいのでサーバーリソースにお金を掛けていません。
1コア500MBぐらいのサーバーで表示してるんじゃないですかね?サーバーロケーションも国外だと思いますが、CDNがどこにあるのかまでは把握していないです。

並列化プログラミング

言葉が気持ち悪いですが、ニュアンスが伝われば幸い。
処理が遅いのは待ち時間が長いからです。待ち時間があるなら、待っている間に別の作業をすればよいのです。
可能なら一気に処理を走らせてしまいましょう。

本サイトも128kbpsの制限をくらった状態でサイトキャッシュを削除すれば分かりますが、Webフォント(重い)を表示するのに時間がかかっています。

ソースの軽量化

分かりやすいのはCSSと画像ファイルですね。
このサイトで使っている画像は.jpgでも.pngでもない次世代の規格です。
最先端すぎて古い端末やブラウザのバージョンによっては正しく表示できないかもしれませんが、そもそもInternetExplorerをサポートしないので仕様としています。
なお、CSSが若干不安です。CSS in JS(emotion)を採用していますが、軽量化というよりは最適化なので冗長な表記がありますが、CSSの要素についてはあまり詳しくないので計測していません。
中身はガッツリSASSですが、コンパイルしているので静的サイト(HTMLソースファイル)で完結できています。

PHPやJavaなどの動的サイトにおける高速化

表示速度を上げる、というアプローチで考えます。
PHPの場合、分かりやすくWordPressが使えるので、WordPressの高速化だと思っていいと思います。

さすがにオープンソースのコア部分をイジるのは勇気がいるので、シンプルに呼び出す処理の回数や、ループに入る前に出来る事を全部定義してしまう等、書き方を工夫する事で解決できるかもしれません。

高速化・プロセス制御を理解したいプログラミング中級者はPythonをやるべき

大体のスクリプト言語はコンパイラがなんかいい感じにやってくれますが、Pythonはそもそもが遅いので高速化の恩恵を露骨に感じる事ができます。
そして、Pythonはアーキテクチャを考える事が多いです。プロセスやスレッド制御だったりメモリ制御を全部自分でやるからです。
話を聞くと難しそう、こわい印象を受けますが、日本語でさえ情報が潤沢で多くの知見があるので、Pythonを理解し始めた頃にアーキテクチャの勉強へステップアップしやすいです。
Pythonを通じてミドルウェアを含めたアーキテクチャに対して抵抗感がなくなってきた時に、PHPやJava(JVM)がどうやって動いているのかを知っていくと、高速化について理解が深まると思います。

なおRubyは自分でなんとかするより優秀なライブラリに依存して、アプリ制作に100%リソースを突っ込んだほうが幸せになれました。
Rubyで遅い原因あるあるですが、ループ処理で重たいクエリを何度も投げるから(Ruby on Railsがなんかいい感じにやってくれているが、これが仇となっている)で、
ほしい結果をピンポイントで得られるように調整したクエリを一回だけ投げて結果をコネコネした方が早くなる事が多いです(私談)

具体的な高速化のイメージ

  • 繰り返し文でやらなくてもいいことは入れない
    • 特に負荷の高い処理は繰り返しに入れない、より軽い書き方に置き換える
  • ファイルを重くして一回だけ読むか、軽いファイルをいくつも作って読むかアーキテクチャを考慮する
    • 不必要なファイルは読まない・作らない
  • 外部ソースは(通信が遅いもの。DBなど)なるべく使わない
  • ヒープやメモリリークを意識して手動でガベージコレクション(GC:OutofMemory対策)する。

1ミリ秒違えば、1000回実施すると1秒の差になります。
企業で扱うデータは1,000,000(百万)件はあるので、1000秒(17分)掛かると考えると、1ミリ秒早くなると劇的な変化が生まれます。

© 2020-2021のむらやごろう(@elder_uncle)

当サイトの全てのコンテンツを転載・無断での引用もお断りしています。