Pythonのお勉強 Part72
!extend:default:vvvvv:1000:1024 !extend:default:vvvvv:1000:1024 ↑スレ立てる毎に減るので、減ってたら3つに補充すること。 ・当スレにRubyのソースコード類を書くことを禁ず ・Ruby等、Pythonではないプログラミング言語での回答類・質問を書くのも禁止 ・「Ruby では」「Rubyでは」「Rails」正規表現→「^クソチョンw$」をNGワード登録推奨 ・エラーを解決したいときは、かならず エラー文(勝手に省略orスクショうp等の横着禁止)と おま環(Pythonのバージョン番号+OS名とバージョン+IDE名)を書け。 ★Pythonのソースコードを5ちゃんに直貼はインデントが崩壊するので、 ↓等のコードうp用サイトに貼ってきてくだしあ。(スクリーンショットをうpる「横着」禁止) ttps://techiedelight.com/compiler/ Run Code機能あり。 ttp://ideone.com/ デフォ設定がCなので、Pythonするには言語種選択ボタン押下がピコ手間かも。 ttp://pastebin.com/ まずまずシンプル。 ttp://dpaste.com/ とてもシンプル。消えるまでの日数は十分長ーく指定のこと。 ◇Pythonオフィシャルサイト http://www.python.org/ ◇Pythonドキュメント https://docs.python.org/ja/3/ ◇まとめwiki ttp://python.rdy.jp/ ※前スレ Pythonのお勉強 Part71 https://mevius.5ch.net/test/read.cgi/tech/1695168821/ VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured if a < b: flag = True else: flag = False は flag = a < b と書ける 圧倒的にすっきりするけど、なんか頭に入ってこなくなる どっちがいいんだろ 別にどっちでも良い 細かいことを気にし過ぎ ただし頭に入ってこないってのは不味い 自分は書かなくても書かれてるコードを理解して頭に入る様にする必要はある 理解できない訳はないけど 0.1秒で判るか0.5秒かかるかという話 >>721 普通はどっちもダメ 単純な比較結果をフラグ化したりしない そんなこと言ったらflagという名前も具体的でないのでNG >>721 現実に前者を書くことは無いような気がする。大抵は、 if a < b: flag = 'hinomaru' else: flag = 'union jack' みたいな使い方でしょ。 a < b の評価値を保存したい場合は、自然と後者になるように思う。 filled = bool(count == limit) みたいにbool()使ってたな Pythonのand/orはbool返さない場合あるし 霊感的には、それは、 (flag = a) < b と解釈させたら、 flagがtrueかfalseにより動作が 違くなるような気がする。というか flag ← (a < b) って感じで ゼッタイ何時でもπソンは解釈するのだろうか。 flag = True if a < b else False flagの代入以外に副作用ないならまずこう書くけど flag = a < b でいいやんとなる >>728 >(flag = a) < b と解釈させたら Pythonの場合はflag=aがstatementで値を返さないのでそういう解釈をさせることができない (flag=a)だけでもassignment statementの文法に反してるからエラー (flag := a > b)と(flag :=a) > bでflagの値が変わる 前者が後者のように評価されないのは演算子の優先順位で決まってるから >>726 >a < b の評価値を保存したい場合は、自然と後者になるように思う。 boolを返すa < b を保存するのが妥当な場合ってどんな用途を想定してるの? ・a < bの処理にそれなりの時間がかかる ・a < bの結果を繰り返し使う ・比較演算子がbool値を返す ・関数ではなく演算子を使うのが妥当 俺は↑これを全部満たすような用途は思いつかない いずれにしろflagを使うほうのコードも含めて考えたほうがいいように思う >>732 > ・a < bの結果を繰り返し使う 繰り返しというか、後で使いたいのだろうな。 a と b 各1ワードを保存できる余裕はないけれど、評価結果 1ビットなら64個保存できる! みたいな。いつの時代の話だよ... 元は、後でif文で使う条件が複数あって、最初Falseで初期化して、 一つでも成立したらTrueにして、みたいな処理になってた で、いろいろリファクタリングしてる途中で、>>721 みたいな変形があった 最終的には条件が1つになったのでそのままif文に入れた a, bが不変であっても 変数化することでコードの見通しがよくなるなら 情報が冗長になってもそうする 現実ではしないflagって命名に囚われてそう >>735 それは条件が複数あったとしても条件式部分を関数化して関数内で早期リターンするパターン forの中でアーリーcontinueとか、関数からアーリーreturnは便利に使うけど、 抜ける先が無くてアーリーなんやらできないと困る 関数内関数はなんか読みにくいし 735みたいに、コードの詳細がわからないのにこう書くべきって決めつけてくる人ってなんでなのかな 理想的なケースでは切り出しやすくても、泥臭いケースだと切り出しても見通し悪くなるだけ、みたいなこと よくあるのに >>739 話題の発端の人だろ、 >>735 は。 仕様書を書いてないから、条件分岐の意味がわからなくなるんだよ。 >>739 >>740 ごめん、まちがえた。737だった。735すまん。 たくさんのファイルを3ステップで加工したい 一つずつやると時間かかるので、並列処理させる 全ファイルをステップ1処理 -> 全ファイルをステップ2処理、という感じ それでかなりスピードアップはするけど、 ステップの継ぎ目部分で全体の完了を待つのが無駄 全体は待たずにファイル毎にどんどん先に進む並列処理を 簡単に書くモジュールある? >>748 処理がファイル間で独立しているならmultiprocessingモジュール Unix環境ならxargsコマンドで足りる話にみえるけど concurrent.futuresモジュールのが書きやすいかもしれん どっちも見てみて あんまりいいサンプルが見つからない キモは、プロセスの実行に条件があるという点 file1-step1が完了してないとfile1-step2は実行できない 必要なプロセスを全部登録して実行させるとそんなことは考慮されないので、 どのプロセスが実行可能か依存関係を教えてやらないといけない モジュール使う分には単純だから公式ドキュメント読んで https://docs.python.org/ja/3/library/multiprocessing.html https://docs.python.org/ja/3/library/concurrent.futures.html それでファイル単位に並列にして ファイルを引数にstep1/step2を関数化したら後は呼ぶだけよ あるいは外部コマンド化して cat paths | xargs -IZ -P $(nproc) sh -c 'step1.py Z; step2.py Z' step1とstep2でプロセスを分けずに全体を1つのプロセスにするということかな 実際にはそれぞれで別のexeファイルを実行するのでなかなか難しい for file in files: step1.exe file for file in files: step2.exe file という形じゃなく step1.exe files step2.exe files という形で実行してるなら各exeがファイル毎に進捗報告やコールバックしてくれないと ファイル単位で処理を先に進めるのは無理 前者でやってるならやりようがあるけど ファイル単位じゃなくステップ単位にまとめるとスピードアップしたということなので その原因を先に確認した上でやり方考えたほうがいい 性能向上のための並行/並列化は 具体的な処理内容やワークロードの特性によってアプローチが変わる one size fits allなやり方は存在しない 何を言ってんだこいつは プログラミング言語の前に国語をやり直せ そうだな>>748 を100万回読み直して相手に何が伝わってると思うか感想を述べよ >>752 >'step1.py Z; step2.py Z' これは'step1-3.py Z’でよくない? キャッシュされてもインタプリタ起動のオーバーヘッドはそれなりにかかるので >>755 なるほど 実際にはまだ何も並行化/並列化できてないという話なのか >実際にはそれぞれで別のexeファイルを実行するのでなかなか難しい だったら↑この思い込みを捨てることから始めたほうがいいよ 結局のところPythonで並行/並列化するなら以下の4択なので 具体的な処理内容とワークロードの特性を加味して適切なものを選んでね 1.非同期 2.マルチスレッド 3.マルチプロセス 4.非同期+マルチプロセス 結局、 proc1.exeをsubprocess.Popen()で並列処理 proc2.exeをsubprocess.Popen()で並列処理 proc3.exeをsubprocess.Popen()で並列処理 となっていたものを、 proc1.exe proc2.exe proc3.exe を実行するbatファイルに移動させて、 batファイルをsubprocess.Popen()で並列処理で目的は達成できた batファイルかー、という気もするけど、並列処理で依存関係を気にした例は見つからなかった (並行処理なら普通) バッチファイルのことをbatファイルと書いているのは初めて見た マジか "バッチファイル" 473,000 "batファイル" 134,000 だから少数派ではあるけど、22%くらいの勢力はあるのに そもそも、batファイルを使った経験自体が少ないのでは >>758 テキストファイルの操作みたいだけど、そういうのは処理範囲を指定して同時に動かすんだよ。 >>760 batファイルという書き言葉は最近、発生しているようだけど、一般書籍でもマイクロソフトでもbatファイルとは呼んでいない。 日本語ではバッチファイル、英語ではbatch file。 バッチファイルを使ったことがないというのは、シェルスクリプトを使ったことがないというのと同じで、Pythonコードも動かいたことがないと思われてしまうレベル。 >>762 ステップは行という意味に思われるからやめた方がいい >>762 複数のファイルと書いてあったな。 並列化には担当するファイルを分けるなどいくらでも方法はある。 マルチプロセスの日本語訳が並列処理、マルチスレッドの日本語訳が並行処理だが、英語ではマルチという言葉で同時実行という言葉ではない。 同時実行という意味を付加しているのは日本語。 EXEファイルを二重起動とかPythonもバッチファイルも関係ねえな 実行ファイルを引数なしで実行するとか、シリアル前提処理を多重起動して、想定どおりにならないとか狂っんなw ID:poYagYhe0 は自作自演のネタ野郎だった >>763 batファイルでも別に普通じゃない? 拡張子batのファイルには違いないんだし txtファイル、jpgファイル、mpgファイルと同じだよ テキストファイルの拡張子をtxtとしているのはWindowsの世界だけ Windowsを使っていてバッチファイルを知らないなんて素人だろ >>770 拡張子は拡張子でしかない JPEGのファイルの拡張子はjpegが本来の拡張子で、jpgはWindows、MS-DOSの拡張子は3文字までという仕様で発生したもの。 さらにWindowsのデフォルト設定だと拡張子を表示しないんだぜ? 何をどう勘違いしているのかな。 拡張子がhtmlだとhtmlファイル、拡張子がhtmだとhtmファイルだと呼ぶなら、単に無知をごまかしているだけ バッチファイルはマイクロソフトの命名のセンスが悪かっただけだが、バッチファイルと作っている会社が言っている名称を使うのが素直 拡張子が3文字だと思っている疑惑があるのと、UNIX、Linuxの世界では拡張子はあくまで目印にすぎない ファイルが何のファイルかは少し読み込んで判断する WindowsでUTF-8のテキストファイルを扱う場合は、テキストファイルにBOMという情報を先頭に書く シェルスクリプトも1行目に自分自身の種類と何で実行するのかを書く どうでもいいことで盛り上がってんなww batファイルってのは同じバッチファイルでも.cmdじゃなく.batだぞってこと htmファイルも同じ まあ個人的には.batファイルのようにドット付きでなら書くけどドット無しでは書かないな >>758 proc1.exeをsubprocess.run() proc2.exeをsubprocess.run() proc3.exeをsubprocess.run() ↑この一連を関数にまとめればbatファイルはいらない それとまとめた関数は直接Popenじゃなくmultiprocessing経由で処理すれば Poolを使う分だけオーバーヘッドが減る あと処理内容次第だけどasyncio使って全部非同期ににしたほうが コードは多少面倒でもリソースが減って速度も出る可能性もある Pool版も問題なく動いた if __name__ == '__main__': が要るのね 子供がエラー出てもなんも判らんのな get() すると判るけど、マルチプロセスにならないので、デバッグ終わったら外す グローバル変数経由で参照させようとしても見えないとか罠がいろいろ apply_async(func, args=(arg,)) の余計なコンマもなんじゃこれと思ったら、無いと動かないんだよな そんなもんバグやがな グローバル変数が参照できるかどうかは処理系依存な気がするんだよな Copy-On-Writeでプロセス増やしてたら普通に参照できる筈 そんな互換性の無いコードが書けていいのかとは思うけど さすがにこのレベルの基礎を押さえていない人は 自称Python初心者でなくても↓こちらのスレへどうぞ >●関連スレ● 自称初心者は↓へ >【まず1嫁】くだすれPython(超初心者用) その59 >https://mevius.5ch.net/test/read.cgi/tech/1689241721/ 要素1個のタプル 1, 要素0個のタプル () なんでやねん コンマこそがタプルを表しているなら、コンマだけが空タプルの本質だろうに 冗長に書いて(,) でもエラーになる コンマがタプルで括弧はおまけだけど空の時だけ例外ルール >>790 あのさ(1)だとタプルじゃなくてただ数値がカッコで括られてるだけと判別出来ないだろ >>792 要素数が変化しない空のシーケンスを表現するためにある fが引数1個を取る関数、gが引数を取らない関数だとしたら apply(f, (1,))とapply(g, ()) のようにempty tupleを使うのが理にかなってる read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる