2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

【まず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
名前: E-mail (省略可) :

read.cgi ver.24052200