質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
並列処理

複数の計算が同時に実行される手法

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1657閲覧

Python  フォルダにある画像を別の2つのフォルダへ並列処理高速で移動させたい

goki_gottan

総合スコア168

並列処理

複数の計算が同時に実行される手法

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/10 06:11

編集2021/02/10 07:21

Pythonでフォルダにある画像を、並列処理して別のフォルダへコピペしたく思います。
しかし、コピペした画像が重複しております。

import time,shutil,glob from concurrent import futures from pathlib import Path x_1,y_1=[],[] input_dir = Path(r"") r1=r"****" r2=r"****" r_1 = glob.glob(r1 + "\*.png") r_2 = glob.glob(r2 + "\*.png") t1 = time.time() def func1(): for path1 in r_1: shutil.move(path1,r1 + "\" + os.path.basename(path1) + ".png" ) def func2(): for path2 in r_2: shutil.move(path2,r2 + "\" + os.path.basename(path2) + ".png" ) future_list = [] with futures.ThreadPoolExecutor() as executor: # タスクを追加する。 future1 = executor.submit(func1) future1.setDaemon(True) future2 = executor.submit(func2) # Future オブジェクトを記録する。 future_list.append(future1) future_list.append(future2) t2 = time.time() elapsed_time = t2-t1 print(f"経過時間:{elapsed_time}")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2021/02/10 07:51

「コピペした画像が重複しております」 とありますが、このコードを実行するとどのような問題があるのでしょう? 具体的に書いていただけますか。
goki_gottan

2021/02/10 08:25

重複の時点で、十分な問題ですよね?文筋をご理解ください。
guest

回答2

0

ベストアンサー

ファイル一個について二回づつ実行しています。

これを避けるには、以下のようにしてください。

python

1 paths = list(input_dir.glob("**/*.jpg")) 2 border, last = len(paths)//2, len(paths)-len(paths)%2 3 for path1, path2 in zip(paths[:border], paths[border:last]): 4 # タスクを追加する。 5 future1 = executor.submit(func1, str(path1)) 6 future1.setDaemon(True) 7 future2 = executor.submit(func2, str(path2)) 8 9 # Future オブジェクトを記録する。 10 future_list.append(future1) 11 future_list.append(future2) 12 if len(paths)%2 == 1: 13 future3 = executor.submit(func2, str(paths[-1])) 14 future_list.append(future3)

投稿2021/02/10 07:24

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なにが問題なのかよくわかりませんが、ばっと見たところ、

python

1def func1(path): 2 shutil.move(a2,r1 + "\" + os.path.basename(*) ) 3

os.path.basename()となってますが、ののところはpathではありませんか?

python

1 future1 = executor.submit(func1, str(path)) 2 future1.setDaemon(True) 3 future2 = executor.submit(func2, str(path))

ここは同じファイルを2回moveしようとしていますが、意図どおりですか?

また、呼ぶ側で、str(path) としてしまっていますが、pathlib.Pathのまま渡せば、 path.name でファイル名が取れますよ。

投稿2021/02/10 07:10

TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

goki_gottan

2021/02/10 07:14

すみません。ちょっとコードに誤植があったと思います。 ありがとうございますが、そのあたりは問題になっておりません。 サイト表記時に誤記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問