【まず1嫁】くだすれPython(超初心者用) その59
1 :デフォルトの名無しさん :2023/07/13(木) 18:48:41.56 ID:INS7SIu4.net 当スレに★Python以外のプログラミング言語での回答類を書くべからず★ 派生言語はそれぞれ専スレがある(この板にあるとは限らない)ので、そっち池。 「Ruby」「Rails」「某言語では」「クソチョンw」をNGワード登録推奨。荒らしは、完全スルー放置が一番きらいです。 このスレッドは「お勉強」スレのほうには書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を、勇気を持って書き込むスレッドです。 へび使いが優しくコメントを返しますので、お礼は Python の布教と初心者の救済をお願いします。 ★エラーを解決したい場合★は、 表示されたエラーの全文(勝手に省略やスクショうp等の横着クソ行為禁止)と、 実行環境(Pythonのバージョン・OSとIDEの種類およびバージョン)をシッカリ書くこと。 Pythonの★ソースコードをそのまま5ちゃんに貼るとインデントが崩れてチヌ★ 【【【複数の連続半角スペースはなにもなかったことにされる&タブは普通には入れられない】】】掲示板の仕様なので、 プログラム文は↓等の、いわゆるコードうp用サイトに貼ってこいください。 ttps://techiedelight.com/compiler/ Run Code機能あり。 ttp://ideone.com/ デフォ設定はC用のため、言語選択ボタン押下がピコ手間かも。 ttp://codepad.org/ ほぼ直感的に使える。Run codeボタンあり。 ttp://pastebin.com/ まずまずシンプル。 ttp://dpaste.com/ とてもシンプル。消えるまでの日数は十分長ーく指定のこと。 ◇Python公式◇ http://www.python.org/ ◇まとめwiki◇ ttp://python.rdy.jp/wiki.cgi 〇前スレ〇 【まず1嫁】くだすれPython(超初心者用) その58 https://mevius.5ch.net/test/read.cgi/tech/1662514433/ 次スレたては >>985 あたりが挑戦する。 ### END OF TEMPLATE ###
740 :デフォルトの名無しさん :2024/06/25(火) 08:47:33.30 ID:PJlEmYUO.net >>737 オブジェクトだからどんな型でも参照渡しなんじゃないのか? もしかして、「参照渡し」という言葉をオレが誤解している?
741 :デフォルトの名無しさん :2024/06/25(火) 09:35:15.76 ID:ZD6OkC9b.net >>740 Pythonは(参照の)値渡し >>737 は間違いで>>739 が正しい def modify(x): x = None x = [1, 2, 3] modify(x) print(x) #この結果をNoneにできるのが参照渡し
742 :デフォルトの名無しさん :2024/06/25(火) 13:25:16.56 ID:PJlEmYUO.net >>741 それは引数の渡し方でなく、x = Noneによって xが新たな Noneオブジェクトを指した結果じゃないかな。 $ cat x.py def modify(xx, yy): print('xx', id(xx), xx) print('yy', id(yy), yy) xx = None # 代入により別オブジェクトを指す。 yy.clear() # 変更結果が返される。 print('xx', id(xx), xx) print('yy', id(yy), yy) x = [1] y = [11] print('x', id(x), x) print('y', id(y), y) modify(x, y) print('x', id(x), x) print('y', id(y), y) $ python3 x.py x 140253632444160 [1] y 140253627941632 [11] xx 140253632444160 [1] yy 140253627941632 [11] xx 140253637855360 None yy 140253627941632 [] x 140253632444160 [1] y 140253627941632 []
743 :デフォルトの名無しさん :2024/06/25(火) 13:26:58.66 ID:ZtCD4zFU.net >>736 Pythonの造りはtcl/ckに似ている
744 :デフォルトの名無しさん :2024/06/25(火) 13:28:25.30 ID:PJlEmYUO.net >>741 で、C言語だとこんな感じかと想像するが、 変数 xの値である 1 を渡すことを、値渡し、 変数 xのポインタである 0x7ffed3b1f5ac を渡すことを、参照渡しと呼んでいた。 $ cat x.c #include <stdio.h> void modify(int *xx, int *yy) { printf("xx %p %d\n", xx, *xx); printf("yy %p %d\n", yy, *yy); int new_xx = 0; xx = &new_xx; /* 代入により別オブジェクトを指すPython風 */ *yy = 0; /* 変更結果が返される。 */ printf("xx %p %d\n", xx, *xx); printf("yy %p %d\n", yy, *yy); return; } int main(void) { int x = 1; int y = 11; modify(&x, &y); printf("x %p %d\n", &x, x); printf("y %p %d\n", &y, y); return 0; } $ cc x.c && ./a.out xx 0x7ffed3b1f5ac 1 yy 0x7ffed3b1f5a8 11 xx 0x7ffed3b1f58c 0 yy 0x7ffed3b1f5a8 0 x 0x7ffed3b1f5ac 1 y 0x7ffed3b1f5a8 0
745 :デフォルトの名無しさん :2024/06/25(火) 13:30:09.56 ID:ZtCD4zFU.net >>742 >>741 は出来ないから参照私じゃないって言ってるんだと思うが 君は日本人か?
746 :デフォルトの名無しさん :2024/06/25(火) 13:31:55.40 ID:ZtCD4zFU.net >>744 >変数 xの値である 1 を渡すことを、値渡し、 >変数 xのポインタである 0x7ffed3b1f5ac を渡すことを、参照渡し そんな事実は無い 「参照私」が出現したのはC++から Cには値私とポインタ私しかない
747 :742 :2024/06/25(火) 14:10:18.90 ID:PJlEmYUO.net >>745 同じ渡し方の二つの引数の一方が出来て、他方が出来ないので、渡し方の問題じゃないよね、という話をしたよ。 >>746 Call by Reference の和訳は、ポインタ渡しでも参照渡しでも良いと思うよ。
748 :デフォルトの名無しさん :2024/06/25(火) 14:20:27.21 ID:mddxyJup.net Cで実装されてるスクリプト言語の引数の渡し方を論じてなんか意味があるのか? そういうメモリモデルってだけの話だ C/C++やFortranみたいにマシンコードと密接に関係してるなら別だが
749 :デフォルトの名無しさん :2024/06/25(火) 14:20:46.33 ID:ZtCD4zFU.net 明確に参照私と言っていたのはPASCALやね
750 :デフォルトの名無しさん :2024/06/25(火) 14:25:08.71 ID:mddxyJup.net こいつが言いたいのは参照渡しってのは明示的にアドレスを渡すのではなく変数を渡すと自動でその参照を渡すようにコンパイルされるような言語ということを言いたいのだろうことは理解できるが それをスクリプト言語のPythonで論じてもナンセンス
751 :デフォルトの名無しさん :2024/06/25(火) 14:37:32.71 ID:PJlEmYUO.net >>748 ,750 > Cで実装されてるスクリプト言語の引数の渡し方を論じてなんか意味があるのか? どうなんだろう? この手の話は、C言語の方が見通しやすかろうと思って添えたが。 意味が見出だせなければ無視して。Python例から等価っぽく想像しただけのものなので。
752 :デフォルトの名無しさん :2024/06/25(火) 14:49:09.86 ID:PJlEmYUO.net >>750 > こいつが言いたいのは参照渡しってのは明示的にアドレスを渡すのではなく変数を渡すと自動でその参照を渡すようにコンパイルされるような言語ということを言いたいのだろうことは理解できるが 俺はその一文を理解できない。 シンプルに、 140253632444160 = id(x) の 140253632444160 に、呼び元呼び先ともにアクセスするので、それは「参照渡し」と言うのだと思っていた。 ということだよ。
753 :デフォルトの名無しさん :2024/06/25(火) 14:56:52.16 ID:mddxyJup.net >>752 CS的にはそれは値渡しだよ ポインタだろうがそれは全て整数をコピーするのだから CS的な参照渡しというのはFortranの以下のような仕様のことを指すことが多い 単に引数をそのまま渡してるのに結果が呼び元に返ってくる https://www.nag-j.co.jp/fortran/FI_11.html#Intents
754 :デフォルトの名無しさん :2024/06/25(火) 16:21:34.93 ID:KN/om7mq.net >>752 その理解がないのにC/C++の参照渡し語ってて草
755 :デフォルトの名無しさん :2024/06/25(火) 16:53:43.01 ID:9x+jYxZG.net a = ["ab","cd"] def f(b): b.clear() b = None f(a) print(a) 値渡しの場合(pythonはこっち) 変数aの参照先の箱aに、["ab","cd"]への参照を値として入れる 変数bの参照先の箱bに、変数aの値(["ab","cd"]への参照)を入れる 変数bの参照先の箱bにある値(["ab","cd"]への参照)のclear()メソッドを実行する 変数bの参照先の箱bに、Noneへの参照を値として入れる 変数aの参照先の箱aにある値([]への参照)を表示する 参照渡しの場合 変数aの参照先の箱aに、["ab","cd"]への参照を値として入れる 変数bの参照先を、変数aの参照先の箱aにする 変数bの参照先の箱aにある値(["ab","cd"]への参照)のclear()メソッドを実行する 変数bの参照先の箱aに、Noneへの参照を値として入れる 変数aの参照先の箱aにある値(Noneへの参照)を表示する c言語の場合も、ポインタの値渡しはあっても、参照渡しは無かった記憶
756 :デフォルトの名無しさん :2024/06/25(火) 17:12:56.33 ID:9x+jYxZG.net void f(int *b) { *b = 2; b = NULL; } void main() { int a = 1; f(&a); printf("%d\n", a); } c言語のポインタの値渡し 変数aの参照先の箱aに、1を値として入れる 変数bの参照先の箱bに、変数aのアドレスを値として入れる 変数bの参照先の箱bにある値(変数aのアドレス)の参照先の箱aに2を入れる 変数bの参照先の箱bに、NULLを値として入れる 変数aの参照先の箱aにある値(2)を表示する void f(int &b) { b = 2; } void main() { int a = 1; f(a); printf("%d\n", a); } c++言語の参照渡し 変数aの参照先の箱aに、1を値として入れる 変数bの参照先を、変数aの参照先の箱aにする 変数bの参照先の箱aに、2を値として入れる 変数aの参照先の箱aにある値(2)を表示する 長文ごめん
757 :デフォルトの名無しさん :2024/06/25(火) 17:20:06.61 ID:ZtCD4zFU.net で?
758 :デフォルトの名無しさん :2024/06/25(火) 17:26:57.66 ID:PNR4S7a4.net >>756 参照渡しは実際には変数を指すポインタを値渡ししていて、本質的には等価だよ ポインタに対するちょっとした構文糖衣に過ぎない ポインタに比べて制限が強い分だけ最適化されやすかったりする可能性はあるが
759 :デフォルトの名無しさん :2024/06/25(火) 17:31:05.84 ID:7aKndPlG.net >>747 yy.clear()のように渡された参照やポインタを通して参照先の値を変更するのと xx = Noneのように渡された参照やポインタ自体を変更するのは同じではない 後者を行った時に呼び出し元の変数も同じように変更されるものが参照渡し >>748 メモリモデルではないよ >>750 引数の渡し方というのはどのプログラミング言語を使う場合にも理解しておくべき基礎 だからスクリプト言語だとナンセンスってことはない もちろんスクリプト言語でも参照渡しをサポートしてる言語はいくつもある
760 :デフォルトの名無しさん :2024/06/25(火) 19:08:21.24 ID:PJlEmYUO.net >>753 ,755,756,759 CS とは何ぞ? その CS的な参照渡しにおける「参照」とは整数以外の何なの? ただ、「参照渡し」とは、サブルーチンへの引数の渡し方でなく、サブルーチンからの引数の返り方を以て、 ・結果が呼び元に返ってくる ・呼び出し元の変数も同じように変更されるもの という性質を言うらしいことが、ボヤっと分かった。 で、参照渡しっぽい事がしたけりゃ、Awkのように配列で授受すれと。 俺は、>>737 と同様に、オブジェクト実体へのポインタや実体のIDの授受を参照渡しと呼ぶのだと思っていたよ。
761 :デフォルトの名無しさん :2024/06/25(火) 19:53:07.98 ID:mddxyJup.net >>760 参照とはオブジェクトを指し示すもののこと ここでいうオブジェクトとはメモリ領域のことでありプログラミング言語においては特定の値のことを指す つまりそれを指し示すようなものであればなんでも良い VM言語であればスタックフレームからのオフセットに過ぎなかったりする
762 :デフォルトの名無しさん :2024/06/25(火) 22:50:01.65 ID:UoDN+2II.net >>760 とりあえずC++では参照渡しはちゃんと定義されている用語で、 知ってる限りではC++での使われ方と違う使われ方はしないものなので、C++における参照渡しを勉強してくれ そしてnullを代入することに意味のある変数を用意して実際に参照渡しのコードを書いてみて CSとはなんぞという質問が物語っていて、Computer Scienceで共有すべき知識を持っていない状態のように思う
763 :デフォルトの名無しさん :2024/06/25(火) 23:11:20.56 ID:nRVgOfun.net >>736 横レスだけど この書き込みありがとう perl好きの俺がなんでpython嫌いなのか わかった気がする
764 :デフォルトの名無しさん :2024/06/25(火) 23:38:25.41 ID:WkoTZsDY.net >>760 >ただ、「参照渡し」とは、サブルーチンへの引数の渡し方でなく、サブルーチンからの引数の返り方を以て、 >・結果が呼び元に返ってくる 引数も結果も「返る」というのは少し違う サブルーチン内での引数を変更するとその時点でその変更が直接呼び出し元に反映される
765 :デフォルトの名無しさん :2024/06/26(水) 00:11:27.85 ID:kR99xHRb.net 間違ったこと書いてた張本人は間違いを指摘されても反省するどころか開き直っちゃってるのが解せない 最近そんなやつが多くて萎える
766 :デフォルトの名無しさん :2024/06/26(水) 00:20:27.75 ID:/ebqJ/eA.net >>765 これな
767 :デフォルトの名無しさん :2024/06/26(水) 00:20:45.10 ID:/ebqJ/eA.net 多分、朝鮮人
768 :デフォルトの名無しさん :2024/06/26(水) 01:10:11.09 ID:yv8Z2CuH.net >>760 番地なのか、番地にあるものなのかのような違いで、Pythonはコンピューターそのものですらやらない方法をとってしまっている。 大きなデータではなければ、コピーを作って渡すのが、ほとんどのプログラミング言語の仕様。 Pythonの関数はアセンブラだと他のプログラミング言語はサブルーチンの呼び出しと同じだが、Pythonはただのジャンプ命令でプログラムを行ったり来たりしているだけ。 いまのCPU内はレジスタが多いからあまり問題にならないが、Pythonも一定の長い連続領域の場合は、メモリとファイルを使うことになる。 同時実行プロセスが多い高性能サーバーとは相性が悪い。 クラウドという仮想サーバーなら、動的に仮想サーバーが変えるから、Pythonでいい。 もともと忘れ去られていた言語が掘り起こされて使われて、変な仕様だがよく使われるようになっただけ。 Pythonそのものが仮想マシンで動くように変更されたから、CUIで復活したのがいつの間にか、メインプログラミング言語になっている奇妙な現象 ただし、AWS社以外はあまり乗り気でない。 洗練されていない汚い言語は、汚く見せない技術がいる。
769 :デフォルトの名無しさん :2024/06/26(水) 01:15:56.13 ID:yv8Z2CuH.net >>764 サブルーチンとは呼び出し元の情報をメモリに保存して、呼び出された側の処理が終わったときにメモリから情報を取り出して元に戻ることだ。 Pythonの関数は後付けであるため、関数と言いながらも実態は処理を書き分けただけにすぎない。 サブルーチンではなく、プログラム内を飛んでいるだけ。 スタック領域にプッシュもポップもしていない。
770 :デフォルトの名無しさん :2024/06/26(水) 01:18:19.20 ID:yv8Z2CuH.net オブジェクトという概念もあとから追加したせいで、わかりにくい分類の型ができてしまった。 コレクションという用語にしなかったのも謎
771 :デフォルトの名無しさん :2024/06/26(水) 10:30:09.24 ID:esETAUdE.net 初心者です、tkinterで作ったGUIの反応が遅い afterでマシにはなったんだけど で、マウスクリックした時刻(OSでのクリック検知時点のシステム時刻)みたいなの取れる方法ありますか やりたいことは、 クリック時刻とbindした関数が呼ばれた時刻をログに取ってみたい Windowsです bindした関数が呼ばれる以前にユーザの作ったプログラムでクリック把握する方法、そんなのあるか!ではなくて、後追いででも確認できないものかと
772 :デフォルトの名無しさん :2024/06/26(水) 11:16:31.48 ID:esETAUdE.net >>771 です そのごググって下記のページで近いことが出来そうかと 本当は早くする方法が知りたいのだけど、今は何を聞けばいいのかもわからないのでまた後程 https://taida-eng.com/%E9%80%86%E5%BC%95%E3%81%8D%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89/python%E9%80%86%E5%BC%95%E3%81%8D%EF%BC%9A%E3%83%9E%E3%82%A6%E3%82%B9%E6%93%8D%E4%BD%9C%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%81%84/
773 :デフォルトの名無しさん :2024/06/26(水) 14:03:59.21 ID:H6JHbd75.net root.bind('<Button-1>', lambda _: print(datetime.datetime.now())
774 :デフォルトの名無しさん :2024/06/26(水) 14:53:45.89 ID:esETAUdE.net >>773 ありがとうございます 早速やってみて、時刻がコンソール出力されることを確認しました やってみると >>772 のリンク先のpynputを使用したほうが早い時刻を取得しており、 体感的にもpynputの時刻がマウス操作時刻と思われます また、関数が呼ばれた時点の時刻も表示したら、 pynput -> 関数 -> rootにbindのラムダ関数の順に表示されました わたくし、何か勘違いしてますでしょうか pynputクリック検知 2024-06-26 14:46:54.026669 関数コール時時刻 2024-06-26 14:46:55.787093 クリック検知時刻 2024-06-26 14:46:56.076000 <- rootにバインドしたラムダ関数 pynputクリック検知 2024-06-26 14:41:35.307322 イベント発生時y 299 chartkobetu呼ばれました 選択中の銘柄 4208 型 <class 'str'> 個別5mの存在順i番目銘柄= 18 存在列 126 銘柄コード 4208 <class 'str'> 個別チャート日足、呼ばれました j= 1 dfcoloffset= 1 linecolor= #ffff00 j= 2 dfcoloffset= 2 linecolor= #189af9 j= 3 dfcoloffset= 3 linecolor= #e38089 j= 4 dfcoloffset= 5 linecolor= #00ff00 クリック検知時刻 2024-06-26 14:41:38.955128
775 :デフォルトの名無しさん :2024/06/26(水) 15:01:12.85 ID:esETAUdE.net >>774 の最後についているのは今作っているコードの動作状況を確認するためprintで出力しているものです 編集中に送信してしまいましたので、時刻検知とは関係ない内容で、時刻の取得時点の比較ができないデータです、すみません
776 :デフォルトの名無しさん :2024/06/26(水) 17:34:00.99 ID:zF60WWs1.net >>774 メインスレッドをブロックして何か処理をしてるんでしょ クリックすると時刻をprintするボタン1つだけ最低限のアプリで クリックに対する反応がどの程度なのかを確認してみたらいいと思う
777 :デフォルトの名無しさん :2024/06/26(水) 19:15:47.84 ID:esETAUdE.net >>776 レスありがとうございます 最小限だと同じ時刻になる、これ以上、細かい桁が測れるのかもよく分からないけど十分速いかと pynputクリック検知 2024-06-26 19:09:50.128802 関数コール時時刻 2024-06-26 19:09:50.128802 Widgetを追加しながら作っていて、 最初にサンプル的なボタンを押してラベル文字書き変えの プログラムでは応答性は何の問題にもならないレベルだったので、 まあこんなものかと
778 :デフォルトの名無しさん :2024/06/26(水) 19:17:32.22 ID:esETAUdE.net >>777 ですけど あまりに遅いので、cProfileで動作時間を測ってはいて 一番長い関数で138ms、 一方でpynputクリック検知 から 関数コール時時刻 までは1.76s (14:46:55.787093 - 14:46:54.026669= 1.7604) もっと遅くなることもある 2秒近くかかる処理なんか作ってないんだけど、さてどうしたものか
779 :デフォルトの名無しさん :2024/06/26(水) 19:23:16.01 ID:esETAUdE.net 連投すまん エクセルVBAで作っていたプログラムを練習がてらpython移植してみるんだけど、 VBAでいうDoEventsみたいなものはpython、tkinterには無い、ということでしょうか ネット検索すると別スレッドで実行しろとか出てくるけど、こっちで考えたほうがいいのかどうか
780 :デフォルトの名無しさん :2024/06/26(水) 21:33:53.43 ID:UcQAC2Co.net VBAのDoEventsをどう使っているのか良うわからんが、subprocess.runじゃだめけ?
781 :デフォルトの名無しさん :2024/06/26(水) 22:20:47.89 ID:esETAUdE.net >>780 ありがとうございます VBAのDoEventsが実行されると、OSのqueueに溜まっているユーザー操作が実行されます もし1周0.2s程度のループをネストして100回やらせると約20秒間かかりきりで(応答なし)になるところ、 内側のループの最初(でなくてもいいけど)にDoEventsを入れれば約0.2s毎にユーザ操作の処理が入るので応答なしにはならず、 0.2sくらいならちょっと反応悪いかな、くらいのレスポンスになります(UI処理をやった分だけ、ループの完了は伸びる) さて、subprocess.runを早速調べてみましたが、OSにやらせたいことをコマンド指定でやらせる、ということでしょうか OS側で溜まってることがあるのならこのタイミングで済ませてな、なにがあるのかしらんけど、という使い方はできるのでしょうか もう少し調べてみます
782 :デフォルトの名無しさん :2024/06/26(水) 22:40:40.89 ID:hSYD6qWQ.net >>777 てことは君のコードが書き方が原因なのは確定なので まずは再現性のある最小限のコードを提示してね それ以外の話はそれから
783 :デフォルトの名無しさん :2024/06/26(水) 23:01:35.15 ID:esETAUdE.net >>782 はい、わたしの作ったコードが反応遅いという話をしています そして最初の質問事項は、マウスクリックした時刻(OSでのクリック検知時点のシステム時刻)みたいなの取れる方法、でした これはググって解決しました 以降の話はレスをいただいた方への返信と、DoEvents相当のものがあるかという質問です エクセルはスレチかと思いますのでエクセルの話を続ける気はありません 引き続き自力でも調べてみます
784 :デフォルトの名無しさん :2024/06/26(水) 23:06:33.48 ID:p3vHraeo.net PythonのGUIアプリなんかどのみち自分用ツールにしかならないんだから、ipywidgets やstreamlitで十分だろう 元々スレッドが分離されてるからビジー状態にしても全く問題ないよ
785 :デフォルトの名無しさん :2024/06/26(水) 23:13:46.30 ID:hG8QBVa6.net pythonのGILのせいじゃないの? そこまで反応性が重要ならpythonは向いてない
786 :デフォルトの名無しさん :2024/06/27(木) 00:43:31.20 ID:DskBlp2q.net 別スレッド化したりしてもtkinterに干渉するとランダムな幅の遅れが出る たとえばプログレスバーをn秒ちょうどで満たすようなコードは書けない(試行毎にバラバラの誤差が生じる) 多分GILとかブロックの問題で、解決できない。これはpythonとtkinterの仕様
787 :デフォルトの名無しさん :2024/06/27(木) 10:04:13.91 ID:OTNDZ+yC.net どんな酷いコード描いてるのか観たいから笑わないからぜひ晒してくれ
788 :デフォルトの名無しさん :2024/06/27(木) 11:44:11.82 ID:THiq2UM5.net >>786 どの言語でも試行毎に誤差はでる その誤差を許容範囲内にするだけ GILの問題でも解決方法はあるよ
789 :デフォルトの名無しさん :2024/06/27(木) 15:00:13.36 ID:oRm7STy0.net 最新のpythonだとGILオフにできるらしい そのバージョンでやってみたら?
790 :デフォルトの名無しさん :2024/06/27(木) 15:06:22.67 ID:WK2H4wzF.net >>783 async使え 懐かしい問題だなw VB時代とかはbackgroundwokerとか使ってUIスレッドを止めないようにしてたけど今の時代ならasync/awaitでお前さんのループでの処理書けばおk
791 :デフォルトの名無しさん :2024/06/27(木) 15:21:15.01 ID:CgIutZfe.net こんな人がasyncにするとこんがらかりそう
792 :デフォルトの名無しさん :2024/06/27(木) 15:40:57.25 ID:oRm7STy0.net pythonのGUIはマルチスレッドで処理を逃してもGILでロックしまくりで遅くなる かといって重い処理を動かすとブロックする async使ってもブロックしたら終わりなのは同じ 詰み
793 :デフォルトの名無しさん :2024/06/27(木) 17:23:36.34 ID:NmEKUmlO.net CPUバウンドな処理はPythonならマルチプロセスにするのが常識 サブインタープリターも使えるようになったけど本格的に使えるのは3.13から async使うのはI/Oバウンドな処理 これも常識
794 :デフォルトの名無しさん :2024/06/27(木) 17:34:34.83 ID:Qbo7b3Vg.net であればGUI制御が別プロセスになってるソリューションがあんのかな それかライブラリを叩く粒度を大きくする工夫があるのか
795 :デフォルトの名無しさん :2024/06/27(木) 18:53:48.27 ID:WKYIGf9o.net 言語やOSに関係なく基本的にどのGUIフレームワークでも アプリケーションのメインスレッドで UIイベントのハンドリングやUI操作を行うことが前提になってる だから別プロセスにするのはGUI制御ではなくてUIに関係ないCPUバウンドの処理 つまり基本的にはGUIフレームワークの守備範囲外
796 :デフォルトの名無しさん :2024/06/27(木) 19:04:32.49 ID:F52juMPQ.net >>791 超初心者用スレで無双か。
797 :デフォルトの名無しさん :2024/06/27(木) 19:09:48.41 ID:oRm7STy0.net >>795 C#はその辺シームレスなんだよね
798 :デフォルトの名無しさん :2024/06/27(木) 22:23:02.86 ID:/FJYXYiJ.net だれも.afterは回答しないのか
799 :デフォルトの名無しさん :2024/06/27(木) 22:39:51.02 ID:QXPbo1LF.net そんなafter使うような真面目な人間は5chに来ない
800 :デフォルトの名無しさん :2024/06/27(木) 23:54:31.61 ID:o3056e9S.net >>797 言語と並行プログラミング用ライブラリとGUIフレームワークの役割分担はC#も基本的に同じ でも同期コンテキストの存在とかTPLの使いやすさとかC#/TPL前提のドキュメントの豊富さとか シームレスに感じる理由が多々あるのはわかる >>798 afterは使ってるって最初に書いてたよ
801 :デフォルトの名無しさん :2024/06/28(金) 08:28:53.40 ID:J/XDPL0h.net async は失敗だったよな Pythonでスレッド数の消費が問題になるようなものを運用してる奴なんて極僅かなんだからライブラリがわざわざ対応する訳がない Javaみたいに世間の流行なんかガン無視してマイクロスレッドに賭けるべきだった
802 :デフォルトの名無しさん :2024/06/28(金) 09:12:53.81 ID:5vFH0KpM.net Web系の要望だろうけど Twistedさん殺しにいかなくてもとは思った
803 :デフォルトの名無しさん :2024/06/28(金) 11:24:07.08 ID:joeyrg+E.net Twisted懐かしいな お世話になりました
804 :デフォルトの名無しさん :2024/06/28(金) 14:11:06.71 ID:sa0QpqCC.net >>801 GIL外したからマイクロスレッドもありなんだよな asyncioを駆使して書き直すのも面倒だし
805 :デフォルトの名無しさん :2024/06/28(金) 17:38:58.38 ID:IKZAS17P.net グリーンスレッドのことをマイクロスレッドと呼んでる? であればasyncのTaskがそれだよ
806 :デフォルトの名無しさん :2024/06/28(金) 17:39:52.27 ID:bVzHKq+e.net インターネットからのパッケージの入手ができないクローズドな環境で Pythonを使ってます Portable運用ができるのでWinPythonを使っているのですが、 同梱されているものがバージョンにより異なり、 PandasやKerasが入っていたりいなかったりするのがちょっと困ってます 自分が必要なものを導入した状態でポータブル化したPython環境、 みたいなものを作る方法はありますでしょうか
807 :デフォルトの名無しさん :2024/06/28(金) 17:44:05.75 ID:sa0QpqCC.net >>805 ちゃうよ ゴルーチンみたいな奴 ちゃんとスレッドは使う
808 :デフォルトの名無しさん :2024/06/28(金) 18:21:18.71 ID:IKZAS17P.net >>807 それはグリーンスレッドのスケジューラー/エグゼキューターが 内部でOSスレッドのスレッドプールを使ってるという話でしょ asyncのTaskをOSのスレッドのスレッドプールで回すのと仕組み的は同じでは? スケジューリング方法の違いやスタックの有無だったり スケジューラー/エグゼキューターが言語にビルトインされてて アプリケーションコードで意識しなくてもいいとか ゴルーチンとの違いはいろいろあるけど それはマイクロスレッドの定義とは関係ないんじゃない?
809 :デフォルトの名無しさん :2024/06/28(金) 18:33:47.84 ID:sa0QpqCC.net >>808 asyncのTaskは数千、数万も作れないでしょ ゴルーチンすなわちマイクロスレッドはそれぐらい作れる設計
810 :デフォルトの名無しさん :2024/06/28(金) 18:50:13.66 ID:IKZAS17P.net >>809 >asyncのTaskは数千、数万も作れないでしょ インタープリターだから生成が遅いというだけで その数は余裕でしょ
811 :デフォルトの名無しさん :2024/06/28(金) 20:02:09.92 ID:TzaR5aOj.net >806 ありますよ
812 :デフォルトの名無しさん :2024/06/28(金) 21:12:32.85 ID:sa0QpqCC.net >>810 asyncはあくまでIOが並列化できるだけ 計算の実態を数万作れるのはゴルーチンだけ よって本質が全く違う
813 :デフォルトの名無しさん :2024/06/28(金) 21:42:27.28 ID:69xrfFOO.net >>812 が間違っていて理解も不足している 各言語のasyncタスクは数万タスク動かせる Pythonでは試していないがおそらく動くのだろう
814 :デフォルトの名無しさん :2024/06/28(金) 22:10:06.47 ID:sa0QpqCC.net >>813 だから動かないって ゴルーチンは「計算の主体」(って意味わかる?) を数百万個作れる これはユーザースペースでコンテキストスイッチをしてるため おまけにスタックサイズも動的な上に小さい 全てマシンコードレベルで行われる 当然ロックなど存在しない これがマイクロスレッド
815 :デフォルトの名無しさん :2024/06/28(金) 22:15:33.56 ID:69xrfFOO.net >>814 君は非同期タスクについて何も知らない無知者だとわかった まずは勉強して知識をつけなさい もう君の相手をすることはない
816 :デフォルトの名無しさん :2024/06/28(金) 22:21:09.52 ID:sa0QpqCC.net >>815 御託はいいから動かしてみてね 思い処理を数万個でいいから Goだと並列でちゃんと動くよ
817 :デフォルトの名無しさん :2024/06/28(金) 22:35:05.70 ID:b9qgRVqH.net asyncのtaskはどの言語でもJavaScriptからRustに至るまで数万個並行で動作するよ そのために各言語に導入されたんだよ
818 :デフォルトの名無しさん :2024/06/29(土) 03:17:28.84 ID:4AUQ0CVf.net Elixir は、10万もの小プロセスを起動できる。 メモリが大きいと、5千万小プロセスも。 ただし、小プロセスは、OS のプロセスとは異なるものです スクエニは、Elixirを使っているらしい Go の並行処理も、mattn の本に書いてあるけど、 C で、OS の100スレッドを起動したら、 CPU 使用率が高く、12秒も掛かったが、 Goで100 goroutine を起動したら、 6スレッドしか起動せず、9秒で済んだ Goの方が、CPUコアを効率的に使える とにかく、スレッドを起動したらダメ! CPUコアや時間の大半が、スレッドの起動処理に使われるから
819 :デフォルトの名無しさん :2024/06/29(土) 08:36:40.26 ID:9/qe2SG9.net 知ったかぶりして間違ったこと書く やんわり間違いを指摘される 反省せずに開き直る! またこの流れ ググればすぐわかるような間違いなのになんなんだろうな
820 :デフォルトの名無しさん :2024/06/29(土) 09:05:37.50 ID:C+0SrrrI.net ElixrはCPU使う処理は得意ではないよ 処理は一瞬で終わるが大量の処理を必要とするようなものが得意 それこそpush通知とかね Goのようにマシンコードレベルでコンテキストスイッチを実装してるわけではないから 重い処理を書くと途端に負荷が上がる
821 :デフォルトの名無しさん :2024/06/30(日) 11:06:44.92 ID:L3wyoKVN.net Erlang最強
822 :デフォルトの名無しさん :2024/07/01(月) 05:47:45.32 ID:ppYg1fh2.net AIならね
230 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver.24052200
本文 スレッドタイトル 投稿者