X



【まず1嫁】くだすれPython(超初心者用) その55

■ このスレッドは過去ログ倉庫に格納されています
2021/10/01(金) 15:46:47.17ID:9qOHXj6D
当スレに★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(超初心者用) その54
https://mevius.5ch.net/test/read.cgi/tech/1623240344/

次スレたては >>985 あたりが挑戦する。
### END OF TEMPLATE ###
2021/10/07(木) 21:40:15.30ID:UdQO/mXQ
> ID:vIJYcTdp
システム依存な話なのでよそでどうぞ
2021/10/07(木) 21:44:37.02ID:vIJYcTdp
>>85
こちらもWindows10です
ずっとコマンドプロンプトでやっていてできてます
今PowerShellでやってみましたが、PowerShellでもできました
\\?\C つけ忘れていませんか?
フルパスで "" もつけてください
ほかに条件あるのだろうか
2021/10/07(木) 21:56:31.61ID:xRnq/kAQ
>>87
\\?\Cは付けてませんでした。
調べたら最後にドットがあるファイルは削除できないとかアクセスできないらしい
やだー こわいからやらなーいw
2021/10/07(木) 22:01:48.59ID:vIJYcTdp
>>88
同様の方法で
del や rd で削除できます
2021/10/07(木) 22:02:37.28ID:vIJYcTdp
>>86
これでいいですか?

p_dir = pathlib.Path(dir)
p_files = list(p_dir.glob("**/*"))

で例外が発生する場合、該当ファイルを読み飛ばして処理を行う方法はありますか?
自力で再帰読込はできればやりたくありません
2021/10/07(木) 22:28:17.75ID:xRnq/kAQ
最後がドッドのアクセスできないディレクトリに入ろうとして例外が出るのかな?
これは自力で再帰読込するしかないよ、再帰はそんな難しくないと思うよ! がんばって^^
2021/10/07(木) 23:35:06.59ID:vIJYcTdp
超レアケースなのでルートのディレクトリ毎エラー処理することにします
できればファイル単位でエラー処理したかったのですが
93デフォルトの名無しさん
垢版 |
2021/10/07(木) 23:50:14.03ID:StWMkIYV
>>82
どうかな

import pathlib
p_dir = pathlib.Path(".")
p_glob = p_dir.glob("**/*")
p_files = []
while True:
    try:
        p = next(p_glob)
        p_files.append(p)
    except FileNotFoundError as e:
        import sys
        print(e, file=sys.stderr)
    except StopIteration:
        break
print(*p_files, sep="\n")
2021/10/07(木) 23:53:44.05ID:vIJYcTdp
>>93
ありがとうございます。
早速検証してみます
2021/10/08(金) 00:17:02.73ID:T4fYgd16
>>93
すごいです
完璧に動いてます
早くこのレベルのプログラムがしたい
本当にありがとうございました
96デフォルトの名無しさん
垢版 |
2021/10/08(金) 00:41:36.79ID:x4lgXBGS
Path.glob()いいね
いままでos.walk()で自前でフィルタしてたけど今度つかってみる
2021/10/08(金) 08:04:57.04ID:dABXXppr
ジェネレーターのスゴさを認識できた
98デフォルトの名無しさん
垢版 |
2021/10/08(金) 09:08:14.69ID:Pr4xGBUG
globって見に行かない名前のファイルかディレクトリなかったっけ?
2021/10/08(金) 09:45:15.17ID:LO45Vby3
for i in range(100):
_if条件:
__time.sleep(3)など
__continue
_if条件:
__time.sleep(3)など
__continue

こういうとき、time.sleep(3)などが重複するのでまとめたいと思い
for i in range(100):
_if i!=0:
__time.sleep(3)など
としましたが
要は、continueするときには必ず実行する文がある
ということなので
continue後毎に処理するような節とかテクニックや慣習はあるのでしょうか
2021/10/08(金) 09:56:28.31ID:3oVEDenR
イマイチ何言ってるかわからんけど、関数でいいんじゃないの?
2021/10/08(金) 10:14:00.03ID:LO45Vby3
if条件の中にはif条件1とif条件2で違う処理も入っているので
continueするときに必ず行う処理はべつのとこに書いた方が見やすいかな
と思ったのです
つまり、continue文の宣言自体がそれ(continueするときに必ず行う処理)を示すような書き方があれば
と思ったのですがなさそうですね
ありがとうございました
2021/10/08(金) 10:20:00.72ID:Q4k4Ultl
書いてる例だけ見るとcontinueを使うべきケースではなさそう
2021/10/08(金) 10:44:16.94ID:LO45Vby3
for i in range(100):
_if i!=0:
__i=0以外で実行する関数1()

↑こういうのってあんまり使わないものなのでしょうか?
continue後時に必ず実行する関数、と違う点は
if i!=0:だと最期のcontinue後は実行されない、ので混乱するかなと。
(else節併用だと野暮になるし)

やはり重複しようが
if 条件1:
_関数A()
_関数1("")
_continue
if 条件2:
_関数B()
_関数1("")
_continue
みたいにした方がいいのかもしれませんね
2021/10/08(金) 10:54:49.70ID:dABXXppr
for i in range(100):
____if i != 0:
________if 条件1:
____________関数A()
________if 条件2:
____________関数B()
________関数1("")
________continue
2021/10/08(金) 11:39:53.95ID:3oVEDenR
>>103
関数1でi==0で実行しない設定にしとけばいいだけだろ。
10645
垢版 |
2021/10/08(金) 12:38:00.40ID:EgdGtVHT
>>50
に書いたけど、

Ruby のglob では、. で始まる、隠し directory/file を除く
107デフォルトの名無しさん
垢版 |
2021/10/08(金) 14:27:43.17ID:hfI/PPIh
tkinterでrowconfigure([1, 2, 3], weight=1)とかすると
_GridIndexにlist[int]できねーよって怒られるんだけど実際はできる
どういう型指定したらいいんでしょうか
2021/10/08(金) 22:41:24.42ID:T4fYgd16
>>93
今日詳細にテストしました。今使っているコードです
p_dir = pathlib.Path(dir)
p_files = []
p_err_files = []
p_glob = p_dir.glob("**/*")
while True:
____try:
________p = next(p_glob)
________dot_chk = False
________for divided_path in str(p).replace("/", "\\").split("\\"):
____________if divided_path[-1] == ".":
________________dot_chk = True
________________break
________if not dot_chk:
____________p_files.append(p)
________else:
____________p_err_files.append(p)
____except FileNotFoundError as e:
________print(e, file=sys.stderr)
____except StopIteration:
________break
____for i in p_err_files:
________for j in p_err_files:
____________if str(i).startswith(str(j)):
________________if len(str(i)) > len(str(j)):
____________________p_err_files.remove(i)
print(*p_files, sep="\n")
print(*p_err_files, sep="\n")
2021/10/08(金) 22:49:21.67ID:T4fYgd16
ドットで終わるディレクトリがあっても例外が発生しない場合があるようです。
例外が発生しない場合、このコードで正常・異常分類できてます
例外が発生した場合、探索が打ち切られているような感じです。
解釈間違ってるかも
例外が発生した場合、全件エラーにした方がよさそうです。
2021/10/08(金) 23:04:50.88ID:T4fYgd16
例外が発生しない場合でも
ドットで終わるファイル・ディレクトリを検出したら全件エラーのほうが安全かな
2021/10/09(土) 08:06:03.22ID:3hwdJKmG
class Person():
_def __init__(self, name, age):
__self.name = name
__self.age = age
_def sample1(self):
__print(self.name,self.age,self.f)

class JapanesePerson(Person):
_def __init__(self,name,age,f=False):
__self.name = name
__self.age = age
__self.f=f

class JapanesePerson2(Person):
_def __init__(self,name,age,f=False):
__super().__init__(name,age)
__self.f=f

yamada = JapanesePerson("山田", 30)
yamada.sample1()
yamada2 = JapanesePerson2("山田2", 20,True)
yamada2.sample1()

JapanesePersonとsuper()つかったJapanesePerson2って同じ意味っすよね?
super()使って書くのって継承したPersonにname,ageがあるぞっていう意味合いのためなんでしょうか?
2021/10/09(土) 08:45:15.87ID:TxyuJC/9
>>111
>JapanesePersonとsuper()つかったJapanesePerson2って同じ意味っすよね?
違うよ、super()を使った方は基底クラスPersonの属性name,ageに値をセットするが
JapanesePersonの方は基底クラスの方にセットせずに重複したJapanesePersonの属性name,ageにセットしている
Personを継承している意味がナッシング
2021/10/09(土) 09:52:36.10ID:3hwdJKmG
>>112
そうなんですね
yamada.sample1() でself.name,self.ageが参照できてるので
なんのためにsuper().__init__でわざわざ値セットする必要があるんだろう??と気になったので。
def sample1(self):のselfってなんなんだ??みたいな
ありやした
2021/10/09(土) 11:41:14.80ID:TxyuJC/9
>>108
>________for divided_path in str(p).replace("/", "\\").split("\\"):
>____________if divided_path[-1] == ".":
これはfor divided_path in p.parts: # で分割できる、pathlibの機能を使おう
更にここは内包表記で一気に書けて
_________if any(part.endswith('.') for part in p.parts):
よってdot_chk変数が不要になる

>____except FileNotFoundError as e:
>________print(e, file=sys.stderr)
これエラー表示してるだけだから、p_err_files.append(p) しといた方が良くない?

>____for i in p_err_files:
>________for j in p_err_files:
>____________if str(i).startswith(str(j)):
>________________if len(str(i)) > len(str(j)):
>____________________p_err_files.remove(i)

こっちの方が早いかも、短いし
____for i in p_err_files:
________p_err_files = [j for j in p_err_files if not j.match(i.name+'/*')]
2021/10/09(土) 12:37:39.05ID:A9QtIjdU
>>114
アドバイスありがとうございます。
内包表記覚えたいと思ってるんですがなかなか身につかないです
glob.glob使っていてpathlib.globに書き直したのでpathlibの他の機能何も知らない状態です
勉強しなきゃいけないこと多いな

>>____except FileNotFoundError as e:
>>________print(e, file=sys.stderr)
>これエラー表示してるだけだから、p_err_files.append(p) しといた方が良くない?
動作確認に使ってるだけなんで、printじゃなくpassでいいかと思ってます。
この例外のメッセージから有用な情報は得られませんでした
例外が発生する以前に、pathlib.globに限らずファイル関連の関数・クラスの挙動があやしいです
pathlib.globは試した範囲では1番挙動がまともでした
2021/10/09(土) 13:10:11.80ID:A9QtIjdU
>>114
>________p_err_files = [j for j in p_err_files if not j.match(i.name+'/*')]
j.match(i.name+'/*')] の部分なんですが、pathlibは'/'で決め打ちして大丈夫なんですか?
pythonが'/'と'\\'をどう使い分けてるかよくわからないです。
取得したパスが'/'と'\\'混在してたりするし・・・
2021/10/09(土) 13:20:34.47ID:A9QtIjdU
>>116
決め打ちじゃなく正規表現の書き方なのか?
急いで調べます
2021/10/09(土) 13:22:15.13ID:TxyuJC/9
>>116
どっち使ってもいいし混在してもいいみたいですよ

>>____except FileNotFoundError as e:
>>________print(e, file=sys.stderr)
これ有益な情報が得られないとあるけど、どのディレクトリかファイルで例外発生したかは分かったの?
分からなかったらpも表示させた方がいいんでない?
2021/10/09(土) 13:49:18.15ID:A9QtIjdU
>>118
例外発生したディレクトリの名前が信用できないんです
except FileNotFoundError as e: のところで分かるのは、発生したということだけです
恐らく発生したと思われるディレクトリ名は既にp_err_filesに入ってます
例外が発生したときのみ全件エラーにするなら何かフラグを立てたほうがいいと思います
今回はドットで終わるものを見つけたら、エラーログにp_err_filesを書き出して
全件処理しないのでこれで十分かと
その後、手作業でエラーログのすべてに対応すると思うので、例外発生個所の情報は使いません
2021/10/09(土) 14:29:12.42ID:TxyuJC/9
>>119
いやいや、例外が発生する箇所はp = next(p_glob)のところで
そこからexcept FileNotFoundError as e: にジャンプしてくるわけですから
p_err_filesには入りません(p_err_filesに入るのは例外が発生しない場合です)

で、おそらくpの変数に代入する前のnext(p_glob)で例外が発生するから
その場合except FileNotFoundError as e:でpを表示させた場合は例外が発生する前のpなわけで
そのpの次にアクセスするディレクトリかファイルで例外が発生するということですよ、きっと

あと/と\\なんですけど、これはファイルパスの区切り文字でLinuxとかが/でWindowsは\\です
Pythonではどっち指定してもいいんですが、これをstr()で文字列にすると文字が違うわけですから
同じパスでも違うパスと判定してしまうので注意です
if str(i).startswith(str(j)):は危険です
2021/10/09(土) 14:45:18.21ID:A9QtIjdU
>>120
詳しく書きますね
最初ドットで終わるディレクトリに入れなくて例外すると考えていました。
テストしているとそうではないと思うようになってきました。
例外が発生原因はドットで終わるディレクトリです
でも必ず例外が発生するわけではありません
pathlib.globが最後に探索する箇所がドットで終わるディレクトリの場合、例外は発生しません
この状態でドットで終わるディレクトリのうしろに問題のないディレクトリを追加します
そうすると、ドットで終わるディレクトリではやはり例外は発生しません
例外が発生するのは次の問題のないディレクトリです
このとき、間違ったファイル名で処理をしようとしてFileNotFoundErrorが発生していると思われます
例外で取得できるのは問題のないディレクトリにアクセスするときの間違ったファイル名です
2021/10/09(土) 15:09:43.07ID:TxyuJC/9
>>121
よく分かりました。それなら言われたとおり例外はpassするだけでいいですね

ところで
____for i in p_err_files:
________p_err_files = [j for j in p_err_files if not j.match(i.name+'/*')]
ですが、、
____for i in p_err_files:
________p_err_files = [j for j in p_err_files if not j.match(str(i/'*'))]
に訂正します

matchの中のstr(i/'*') は文字列にした場合区切り文字が\\になります
これをstr(i) + '/*'として/と\\を混在させてもmatchでは正常に動くようです
123デフォルトの名無しさん
垢版 |
2021/10/09(土) 15:30:28.23ID:Ngy1mnu3
printと書かない以外でなんか出力するのある?
124デフォルトの名無しさん
垢版 |
2021/10/09(土) 16:19:52.75ID:/xiMgjvY
sys.stdout.write()
125デフォルトの名無しさん
垢版 |
2021/10/09(土) 16:24:43.13ID:dPZPc1xL
WindowsというかDOSの頃から内部は/でもパス区切りできて
バックスラッシュ要求するのはシェルや一部のアプリ
単体プログラムなら/で書いたほうがポータビリティある
2021/10/09(土) 18:09:17.61ID:JVX7Q22F
>>121
Path.globでイテレータを作成した後に追加・削除されたファイルやディレクトリは
イテレーションに含まれるか含まれないかは不定なので
それでも困らないような使い方じゃなければ使い方が悪い

>例外で取得できるのは問題のないディレクトリにアクセスするときの間違ったファイル名です
問題のないディレクトリなのに間違ったファイル名なのか・・・・
全部読んでないからかよくわからん
127デフォルトの名無しさん
垢版 |
2021/10/09(土) 19:07:55.16ID:Ngy1mnu3
統合環境?総合環境?
おすすめの教えて
winでもマックでもリヌクスでもいいです
128デフォルトの名無しさん
垢版 |
2021/10/09(土) 19:13:36.12ID:/xiMgjvY
eric4
2021/10/09(土) 19:19:03.79ID:A9QtIjdU
>>126
書き方があいまいでしたね
イテレータを作成する前に追加してます
2021/10/09(土) 21:23:39.35ID:aguDhBGS
>>127
Jupyter Notebook、Notebookの後継であるJupyterLab、
VSCode, Google Collaboratory

YouTube などで、よく紹介されているのは、Google Collaboratory

他には、WSL2, Linux, Docker

多言語のversion manager なら、asdf とか、
日本人が作った、バージョンマネージャーのanyenv とか

anyenvでは、19言語を統一された方法で、
nodenv, phpenv, pyenv, rbenv, goenv, jlenv などを使う。
Python ならpyenv、Julia ならjlenv

Python標準では、venv

多くの言語で、version manager の使い方を統一したいのなら、asdf, anyenv
131デフォルトの名無しさん
垢版 |
2021/10/09(土) 23:27:09.55ID:cIVnj/jm
>>130
ありがとう
参考にしてそれぞれ入れてみて稼働確認?動作軽いのか?とかやってみます。
132130
垢版 |
2021/10/10(日) 00:15:53.95ID:lB7MFpHR
プロ用では、anyenv から、Docker へ移行していくだろう
133デフォルトの名無しさん
垢版 |
2021/10/10(日) 05:07:59.49ID:wTu2fZfo
tkinterにドラッグアンドドロップつける
tkinterDnD2というやつ

dnd_root.bind(<Drop>, callback)
callback(ev):
__files = dnd_root.splitlist(ev.data)

みたいに書きます
このevてdndEventクラスで
http://tkinterdnd.sourceforge.net/TkinterDnD.html#DnDEvent
にあるように、いくつかの属性にアクセスできるんだけど
この属性のそれぞれが何を意味してるのかっていうのは、どこに書いてあるんでしょうか
ドキュメント的なものを探してるんだけど、見当たらなくて
134デフォルトの名無しさん
垢版 |
2021/10/10(日) 08:00:27.46ID:kKlMir+m
>>133
https://www.ellogon.org/petasis/index.php/tcltk-projects/tkdnd/tkdnd-man-page#lbAI
TkinterDnD.pyは読んでる前提
135デフォルトの名無しさん
垢版 |
2021/10/10(日) 09:09:58.87ID:wTu2fZfo
>>134
おー助かりました
136デフォルトの名無しさん
垢版 |
2021/10/10(日) 09:10:27.91ID:YLnhElYI
>>127
統合開発環境ね
パイチャームかVisualStudioかインテリj
2021/10/10(日) 11:33:12.15ID:ykpYSE0z
私の開発環境はIDLEとGVIMだわ、大したことやってないし
2021/10/10(日) 12:39:25.44ID:H4xzBt6k
importで頭が混乱してきました
https://pastebin.com/tRafMmRt

sample0.pyのimport sample2で、sample2内のsample1がimportされると思ったのですが
結果、importはされませんでした
そう判断したのは、sample0→sample2でのsample1のimportで
printもされず、BASEのランダムも生成されなかったからです

これは、sample0.pyでsample1をすでにimportしているので
sample2内のsample1のimportは省略というか、
sample0でのsample1のimportを引き継いだ
みたいなことでいいのでしょうか・・?
139デフォルトの名無しさん
垢版 |
2021/10/10(日) 13:16:40.64ID:kKlMir+m
>>138
そう
あちこちにあるimport sys他が都度走るのはいやだし

https://docs.python.org/ja/3/reference/import.html
他の動作も可能だけれどフレームワーク実装とか特殊なケースでなければ
モジュール側でうまく対応した方が良い。
2021/10/10(日) 13:24:05.94ID:H4xzBt6k
>>139
なるほど・・
どうもimportするたびに新規発行されるみたいなイメージが強くなってしまって・・
>あちこちにあるimport sys他が都度走る
たしかにそうですよね
ありがとうございました
2021/10/10(日) 14:08:59.72ID:PpP5FnLO
>>114
>>122

for x in range(500000):
p_err_files = p_err_files_org.copy()
for i in p_err_files:
for j in p_err_files:
if str(i).replace("/", "\\").startswith(str(j).replace("/", "\\")):
if len(str(i)) > len(str(j)):
p_err_files.remove(i)
7秒

for x in range(500000):
p_err_files = p_err_files_org.copy()
for i in p_err_files:
p_err_files = [j for j in p_err_files if not j.match(str(i/'*'))]
97秒

p_err_filesの内容によってどう変わるかわかりませんがかなり遅いです
綺麗な書き方だけにどうにかしたい
報告です。質問じゃないです
2021/10/10(日) 15:13:50.14ID:ykpYSE0z
>>141
ふむ、matchが遅いのだろうね、、じゃあ二人の良いところをドッキングしよう
for x in range(500000):
____p_err_files = p_err_files_org.copy()
____for i in p_err_files:
________i = str(i).replace("/", "\\") + '\\' #replaceのせいで見にくいからあえて別にしてみました
________p_err_files = [j for j in p_err_files if not str(j).replace("/", "\\").startswith(i)]
これは3秒いっちゃうんじゃない?

ところで/と\\って混在するの? pathlib.Pathをstr変換するとOSに合わせた区切り文字で文字列化しない?
replaceいらないんじゃない? いや、私も昔混在しててエラーになった経験があるんだけども
それって文字列化してから自分でスラッシュを足して混在させてたような気がしてきた
今適当にやってみても混在しないし・・さ
2021/10/10(日) 16:01:08.25ID:PpP5FnLO
>>142
4秒になりました、内包表記早い
最近も混在してエラーになりました。詳しく調べてないです
気になるときは.replace("/", "\\")つけてます
2021/10/10(日) 16:15:29.74ID:PpP5FnLO
混在するのいやだから自分でつなぐときos.path.join使ってます
今ソース確認したけど"/"使ってない
2021/10/10(日) 16:23:35.36ID:ykpYSE0z
>>143
ttps://docs.python.org/ja/3/library/pathlib.html#operators
パスオブジェクトの文字列表現はそのシステム自身の Raw ファイルシステムパス (ネイティブの形式、
例えば Windows では区切り文字がバックスラッシュ) になり、
文字列としてファイルパスを取るあらゆる関数に渡すことができます

ほらほら、仕様的にWindowsでstr変換すると\\になるよん

>>144
ふーん、ちなみにpathlib.Pathにもjoinpathがあるからそっちの方がいいかも
2021/10/10(日) 17:00:09.47ID:PpP5FnLO
取得したばかだから混在はないですね
最終形
for x in range(500000):
____p_err_files = p_err_files_org.copy()
____for i in p_err_files:
________p_err_files = [j for j in p_err_files if not str(j).startswith(str(i) + os.sep)]
2021/10/10(日) 17:10:38.07ID:ykpYSE0z
>>146
う、美しい、、os.sepもエレガント
2021/10/10(日) 20:43:45.45ID:PpP5FnLO
ありゃ、バグってたかも(最終形じゃないやつ)

新コード 14秒

for x in range(5000):
____p_err_files = [str(p) for p in p_err_files_org]
____for i_idx, i in enumerate(p_err_files[:-1]):
________for j in p_err_files[i_idx + 1:]:
____________if j.startswith(i + os.sep):
________________p_err_files.remove(j)
____p_err_files = [pathlib.Path(p) for p in p_err_files]

最終形って書いたコード 56秒

新コードがバグってないかよくテストしなければ
2021/10/10(日) 21:08:00.05ID:PpP5FnLO
最初のデータだと
新コード 14秒
最終形って書いたコード 4秒
件数が多いと新コードが早い
2021/10/10(日) 21:41:11.57ID:ykpYSE0z
for x in range(5000):
____p_err_files = p_err_files_org.copy()
____for i in p_err_files:
________if i.is_dir():
____________i = str(i) + os.sep
____________p_err_files = [j for j in p_err_files if not str(j).startswith(i)]

最速のコード・・できました、、これは2秒台かもしれん
最後がドットのディレクトリでis_dir()ができるのか知りませんが
2021/10/10(日) 22:14:56.87ID:PpP5FnLO
>>150
衝撃の結果 最初のデータ(件数の少ないやつ)
新コード 14秒
最終形って書いたコード 4秒
isdir 167秒
コードを見ると一見早そうに見えるんだけど
2021/10/10(日) 22:25:50.37ID:PpP5FnLO
件数の多いデータ loop回数減らしてます
新コード 2秒
最終形って書いたコード 11秒
isdir 60秒
153デフォルトの名無しさん
垢版 |
2021/10/10(日) 22:53:16.01ID:fsOtTZsl
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

あー、ホンッとに思い出すなあ(笑)
キチガイの嘘つきの低レベルFランの、
朝鮮ゴキブリBot君は、
チョン独特の「なにもできないけど俺のほうがジャップより偉い!」的な
ことはよーくわかったよ。
ホントなにもできない朝鮮ゴキブリBot君!

クソチョンw
154デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:14:16.55ID:kKlMir+m
is_dir()はos.stat(fstat)つかってそうだし遅いだろうね
事後処理多すぎるしos.walk()のが適当かも
2021/10/10(日) 23:25:00.22ID:ykpYSE0z
for x in range(5000):
____p_err_files = p_err_files_org.copy()
____for idx, i in enumerate(p_err_files[:-1], start=1):
________i = str(i) + os.sep #これは出した方が速いの?変わらない?
________p_err_files = [j for j in p_err_files[idx:] if not str(j).startswith(i)]
界王拳3倍だぁああああ
2021/10/10(日) 23:36:40.30ID:ykpYSE0z
やっぱ>>155は無し
このp_err_files[:-1]やp_err_files[idx:]ってダメな気がする
途中でp_err_filesの要素抜くからバグる気がするんだけど・・
新コードと最終形の結果同じなんだよね?
2021/10/10(日) 23:50:06.43ID:PpP5FnLO
>>155
最初のデータ(件数の少ないやつ)
新コード 14秒
155のやつ 2秒

件数の多いデータ 466件
新コード 28秒
155のやつ 32秒


件数の多いほうほぼ互角ですね

>________i = str(i) + os.sep #これは出した方が速いの?変わらない?
圧倒的に速いです
2021/10/10(日) 23:51:21.86ID:PpP5FnLO
>>156
新コードと最終形の結果は同じです
古いコードはバグってました
2021/10/10(日) 23:57:12.93ID:ykpYSE0z
for x in range(5000):
____p_err_files = p_err_files_org.copy()
____for i in p_err_files:
________if i in p_err_files:
____________i = str(i) + os.sep
____________p_err_files = [j for j in p_err_files if not str(j).startswith(i)]

はい、これ最後にするわw inで抜いた要素の場合は処理を飛ばすです
is_dir()みたいに遅いかも? お疲れっした!
2021/10/11(月) 00:00:41.38ID:Z6IULiPa
>>155

155は結果がおかしいです
2021/10/11(月) 07:20:20.01ID:nIh2l5lJ
出来ました、これが本当の最後! globで作られるリストでは先にディレクトリが並び、
後にそのディレクトリ内のファイルが並ぶことを利用して
消えるのは常にidxの後ろのファイルであることを考慮したものです

for x in range(5000):
____p_err_files = p_err_files_org.copy()
____for idx in range(len(p_err_files)):
________try:
____________i = str(p_err_files[idx]) + os.sep
________except IndexError:
____________break
________p_err_files = [j for j in p_err_files if not str(j).startswith(i)]
見てくださいこのカッコイイボディー、1秒台を叩き出すポテンシャルが伺えます
2021/10/11(月) 14:30:12.13ID:Z6IULiPa
最新コードです
メインループはリスト、サブループは集合
リストは長さでソート
集合で in を高速にし、内包表記で削除するデータを集め差集合を求める
件数が多い場合に焦点を当ててます

for x in range(5000):
____p_err_files = p_err_files_org.copy()
____p_err_list = sorted([str(p) for p in p_err_files], key = len)
____p_err_set = set(p_err_list)
____for i in p_err_list:
________if i in p_err_set:
____________i += os.sep
____________p_err_set -= {j for j in p_err_set if j.startswith(i)}
____p_err_files = [pathlib.Path(p) for p in p_err_set]

測定結果は後ほど
163デフォルトの名無しさん
垢版 |
2021/10/11(月) 15:03:13.08ID:yoxInkMN
p_err_files_orgを含めてideoneあたりに貼ってくれんかな
2021/10/11(月) 15:04:52.03ID:Z6IULiPa
最初のデータ(件数の少ないやつ) 500,000ループ
最新コード 14秒
新コード 13秒
最終形って書いたコード 4秒
159 3秒
161 3秒

件数の多いデータ 466件 5,000ループ
最新コード 4秒
新コード 14秒
最終形って書いたコード 54秒
159 28秒
161 13秒

巨大ディレクトリテスト 122496件 1ループ
最新コード 223秒
新コード 277秒
最終形って書いたコード 測定不能ギブアップ
159 ギブアップ
161 ギブアップ
2021/10/11(月) 15:38:36.71ID:9gfKW03X
> ID:PpP5FnLO, ID:ykpYSE0z
そろそろやめてもらっていいですか
2021/10/11(月) 15:38:47.81ID:nIh2l5lJ
>>164
ブラボー、集合速い!

ちなみに最新コードのsetで順番が変わった結果は、これで戻せると思います
____p_err_files = sorted([pathlib.Path(p) for p in p_err_set] , key=p_err_files_org.index)
2021/10/12(火) 00:09:42.22ID:QANgax+i
>>165
ガイジに話が通じると思ってる奴もガイジ
168デフォルトの名無しさん
垢版 |
2021/10/12(火) 13:14:04.41ID:Y4+OaxqJ
uuid含む辞書 のリストの検索って
やっぱ内包表記が一番早いですか?
item = [d for d in db if d[id] == _id][0]
169デフォルトの名無しさん
垢版 |
2021/10/12(火) 14:22:16.90ID:65IdcDyl
>>168
それだと遅延評価されずに全走査してから[0]を解決するから
リストが長いと不利
2021/10/12(火) 17:12:16.40ID:db3N35kL
>>169
こうですか?
item = next(filter(lambda d: d[id] == _id, db))
171デフォルトの名無しさん
垢版 |
2021/10/12(火) 18:55:46.32ID:rbfrUXN4
線形探索に変わりはないから本質的には変わらない
規模と目的にもよるが事前にハッシュテーブルを作成するなりしたらいいんじゃない?
172デフォルトの名無しさん
垢版 |
2021/10/12(火) 19:05:49.73ID:rbfrUXN4
>>170
最初の1つを取得したいなら素直にfor文で回して見つけ次第breakすればいいんじゃない?
2021/10/12(火) 19:27:30.01ID:db3N35kL
>>172
検索速度を速くするために内包表記、全走査せず見つけたら止まるようにジェネレータを使うので
item = next(filter(lambda d: d[id] == _id, db))
もしくは、
item = next(d for d in db if d[id] == _id)

>>171
ハッシュテーブル使うならこうですか?
item = eval(' | '.join([f'db[{i}]' for i in range(len(db))]))[id]
174デフォルトの名無しさん
垢版 |
2021/10/12(火) 19:48:08.27ID:Y4+OaxqJ
謎のなりすましw
175デフォルトの名無しさん
垢版 |
2021/10/12(火) 20:14:27.30ID:DOoMLgfj
tkinterとMVCを勉強中なんですが
view用のtkvarってmodel(db)に置くんですか?
view側が持つのですか?
2021/10/12(火) 20:38:17.90ID:db3N35kL
>>174
答えは見つかりましたか?
177デフォルトの名無しさん
垢版 |
2021/10/13(水) 00:27:53.69ID:zS1AsSBo
>>173
内包表記使わないと死ぬ病気なの?
いつ、何故内包表記が速くなるか勉強した方がいい
ネットに落ちているサンプルコードのように繰り返しappendする訳でもないのだから大して変わらん
178デフォルトの名無しさん
垢版 |
2021/10/13(水) 04:42:48.68ID:+txmauo5
>>175

view
ウィジェットとtkvar(表示(view)に関わる)

model
変数(データ実体)

controller
view.widget.tkvar.set(mode.var)

おれの認識
2021/10/13(水) 08:21:06.00ID:5N5C/lUt
>>177
内包表記みるとファビョっちゃう病気なの?
内包表記が速くなるだけじゃないことを勉強した方がいい
ネットに落ちてるサンプルコードのように単純な処理のだから内包表記を使わない手はない
2021/10/13(水) 08:46:20.82ID:XAFUKX/t
内包表記ってなんですか?
181デフォルトの名無しさん
垢版 |
2021/10/13(水) 10:54:11.99ID:V99uCirA
[_ for _ in (1,2,3)]
2021/10/13(水) 12:56:21.92ID:xAxceSCu
どんなに複雑なコードでも内包表記で書こうとするような奴はPython向いてないとは思う
2021/10/13(水) 13:38:38.75ID:znbxIIJY
馬鹿の一つ覚え
184デフォルトの名無しさん
垢版 |
2021/10/13(水) 14:17:57.86ID:k/aGOBxZ
next filterは見た目いいけどそのままだと例外飛ぶからdefault指定すべき
あとid検索をしょっちゅうやるつもりなら171の言う通りidをキーに持つハッシュテーブルにしたほうがいい
185デフォルトの名無しさん
垢版 |
2021/10/13(水) 15:04:27.22ID:i0OqJqsg
ネストする時は内包表記でもインデントしてね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況