我从我的老师那里复制了一个.py文件,并将其加载到Pycharm 4.04中的一个项目中.当我试图右键单击并运行它时,它显示"在'foo.py'中运行Doctests"而不是常规的"运行'foo.py'",我无法找到如何正常运行它.
我在设置搜索"文档测试",发现什么都没有,和PyCharm文档中在这里,也没什么可说要么禁用文档测试.
我在这里发现了一个类似的问题: Pycharm不允许运行文件.仅显示运行unittest选项. 并尝试了建议的解决方案,但它仍然在上下文菜单中显示"在'foo.py'中运行doctests".
多处理模块对于python初学者来说非常困惑,特别是那些刚刚从MATLAB迁移并且使用并行计算工具箱变得懒惰的人.我有以下功能需要大约80秒运行,我想通过使用Python的多处理模块来缩短这个时间.
from time import time
xmax = 100000000
start = time()
for x in range(xmax):
y = ((x+5)**2+x-40)
if y <= 0xf+1:
print('Condition met at: ', y, x)
end = time()
tt = end-start #total time
print('Each iteration took: ', tt/xmax)
print('Total time: ', tt)
Run Code Online (Sandbox Code Playgroud)
这按预期输出:
Condition met at: -15 0
Condition met at: -3 1
Condition met at: 11 2
Each iteration took: 8.667453265190124e-07
Total time: 86.67453265190125
Run Code Online (Sandbox Code Playgroud)
由于循环的任何迭代都不依赖于其他循环,我尝试从官方文档中采用此服务器进程来在单独的进程中扫描范围的块.最后我想出了vartec对这个问题的回答,可以准备以下代码.我还根据Darkonaut对当前问题的回答更新了代码.
from time import time
import multiprocessing as …Run Code Online (Sandbox Code Playgroud) python parallel-processing multiprocessing python-3.x python-multiprocessing
我正在做一些并行处理,如下所示:
with mp.Pool(8) as tmpPool:
results = tmpPool.starmap(my_function, inputs)
Run Code Online (Sandbox Code Playgroud)
输入看起来像:[(1,0.2312),(5,0.52)...],即一个int和float的元组。
该代码运行良好,但我似乎无法将其包裹在加载栏(tqdm)上,例如可以使用imap方法完成,如下所示:
tqdm.tqdm(mp.imap(some_function,some_inputs))
Run Code Online (Sandbox Code Playgroud)
星图也可以做到吗?
谢谢!
python multiprocessing python-multiprocessing tqdm process-pool
假设我有一个包含随机数的巨大列表,例如
L = [random.randrange(0,25000000000) for _ in range(1000000000)]
Run Code Online (Sandbox Code Playgroud)
我需要删除此列表中的重复项
我为包含较少元素的列表编写了此代码
def remove_duplicates(list_to_deduplicate):
seen = set()
result=[]
for i in list_to_deduplicate:
if i not in seen:
result.append(i)
seen.add(i)
return result
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我创建了一个集合,这样我就可以记住哪些数字已经出现在我正在处理的列表中,如果该数字不在集合中,那么我将它添加到我需要返回的结果列表中并将其保存在设置以便它不会再次添加到结果列表中
现在,对于列表中的 1000000 个数字,一切都很好,我可以快速得到结果,但对于比 1000000000 个问题出现的数字,我需要使用机器上的不同内核来尝试解决问题,然后将多个结果结合起来流程
我的第一个猜测是让所有进程都可以访问一个集合,但会出现许多复杂情况一个进程如何读取而另一个进程正在添加到集合中,我什至不知道是否可以在我知道的进程之间共享一个集合我们可以使用队列或管道,但我不确定如何使用它
有人可以就解决这个问题的最佳方法给我建议吗?我对任何新想法持开放态度
python optimization duplicates multiprocessing python-multiprocessing
我试图在 python 中创建的框中打印一条消息,但它不是直接向下打印,而是水平打印。
def border_msg(msg):
row = len(msg)
columns = len(msg[0])
h = ''.join(['+'] + ['-' *columns] + ['+'])
result = [h] + ["|%s|" % row for row in msg] + [h]
return result
Run Code Online (Sandbox Code Playgroud)
预期结果
border_msg('hello')
+-------+
| hello |
+-------+
Run Code Online (Sandbox Code Playgroud)
但得到了
['+-+', '|h|', '|e|', '|l|', '|l|', '|o|', '+-+'].
Run Code Online (Sandbox Code Playgroud) 我的输出如下所示:
nutrition_info_256174499 = df1.loc[:"Salt" , "%Reference Intake*"]
print (nutrition_info_256174499)
Typical Values
Energy 5%
Fat 1%
of which saturates 1%
Carbohydrates 7%
of which sugars 2%
Fibre -
Protein 7%
Salt 6%
Name: %Reference Intake*, dtype: object
Run Code Online (Sandbox Code Playgroud)
必须做什么才能在输出结束时删除 Name 和 dtype?
我想命名 a 中的线程multiprocessing.dummy.Pool,以便当我threading.enumerate()从主线程调用时可以查看它们的所有名称。pool.apply_async当我调用能够命名线程时,是否可以应用关键字?我宁愿在创建时命名它们,而不是在tester函数内部命名,只是为了简洁。
例如,如果我有下面的示例代码:
import multiprocessing.dummy
from time import sleep
import threading
def tester():
sleep(2)
print("running \n")
def run_conc(number_of_threads, fxn):
pool = multiprocessing.dummy.Pool(processes=number_of_threads)
for thread in range(number_of_threads):
pool.apply_async(tester)
print(threading.enumerate(), "\n")
pool.close()
pool.join()
run_conc(3, tester)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到输出:
[<_MainThread(MainThread, started 140735632434048)>, <Thread(SockThread, started daemon 123145521917952)>, <DummyProcess(Thread-1, started daemon 123145527246848)>, <DummyProcess(Thread-2, started daemon 123145532502016)>, <DummyProcess(Thread-3, started daemon 123145537757184)>, <Thread(Thread-4, started daemon 123145543012352)>, <Thread(Thread-5, started daemon 123145548267520)>, <Thread(Thread-6, started daemon 123145553522688)>]
running
running
running
Run Code Online (Sandbox Code Playgroud)
我希望能够命名该线程列表中的 3 个虚拟线程,以便我可以识别哪个是哪个。或者也许有一种方法可以从内部做到这一点 …
我正在尝试使用多处理模块重新启动 python 进程,但出现“断言错误:无法启动进程两次”。
我的问题
import time
from multiprocessing import Process
def worker ():
while True:
print "Inside the worker"
time.sleep(10)
p1 = Process(target=worker,name="worker")
p1.start()
#p1.join()
time.sleep(3)
p1.terminate()
print "after Termination "
time.sleep(3)
p1.start()
Run Code Online (Sandbox Code Playgroud)
实际上,我正在尝试创建一个进程监视器功能来监视所有进程的内存和 CPU 使用情况。如果达到一定水平,我想实时重新启动
所以我尝试在字典的字典上使用多处理管理器,这是我最初的尝试:
from multiprocessing import Process, Manager
def task(stat):
test['z'] += 1
test['y']['Y0'] += 5
if __name__ == '__main__':
test = Manager().dict({'x': {'X0': 10, 'X1': 20}, 'y': {'Y0': 0, 'Y1': 0}, 'z': 0})
p = Process(target=task, args=(test,))
p.start()
p.join()
print(test)
Run Code Online (Sandbox Code Playgroud)
当然,当我运行这个时,输出不是我所期望的,z更新正确,但y没有改变!这是输出:
{'x': {'X0': 10, 'X1': 20}, 'y': {'Y0': 0, 'Y1': 0}, 'z': 1}
Run Code Online (Sandbox Code Playgroud)
然后我用谷歌搜索,在这里找到了一个解释,显然嵌套字典也必须是Manager().dict()s 而不是普通的 python 字典(可能从 Python 3.6 开始)。所以我做了以下事情:
from multiprocessing import Process, Manager
def task(stat):
test['z'] += 1
test['y']['Y0'] += 5
if …Run Code Online (Sandbox Code Playgroud) python multiprocessing python-3.x python-multiprocessing multiprocessing-manager
我已经定义了这个函数
def writeonfiles(a,seed):
random.seed(seed)
f = open(a, "w+")
for i in range(0,10):
j = random.randint(0,10)
#print j
f.write(j)
f.close()
Run Code Online (Sandbox Code Playgroud)
其中 a 是包含文件路径的字符串,seed 是整数种子。我想以这样的方式并行化一个简单的程序,即每个核心采用我提供的可用路径之一,为其随机生成器提供种子并在该文件上写入一些随机数,例如,如果我传递向量
vector = [Test/file1.txt, Test/file2.txt]
Run Code Online (Sandbox Code Playgroud)
和种子
seeds = (123412, 989898),
Run Code Online (Sandbox Code Playgroud)
它为第一个可用的核心提供了功能
writeonfiles(Test/file1.txt, 123412)
Run Code Online (Sandbox Code Playgroud)
和第二个具有不同参数的相同函数:
writeonfiles(Test/file2.txt, 989898)
Run Code Online (Sandbox Code Playgroud)
我在 Stackoverflow 上浏览了很多类似的问题,但我无法做出任何解决方案。我试过的是:
def writeonfiles_unpack(args):
return writeonfiles(*args)
if __name__ == "__main__":
folder = ["Test/%d.csv" %i for i in range(0,4)]
seed = [234124, 663123, 12345 ,123833]
p = multiprocessing.Pool()
p.map(writeonfiles, (folder,seed))
Run Code Online (Sandbox Code Playgroud)
并给我 TypeError: writeonfiles() 正好需要 2 个参数(给定 1 个)。
我也试过
if __name__ == …Run Code Online (Sandbox Code Playgroud) python arguments multiprocessing python-2.7 python-multiprocessing
python ×10
python-3.x ×2
arguments ×1
duplicates ×1
optimization ×1
pandas ×1
process-pool ×1
pycharm ×1
python-2.7 ×1
string ×1
tqdm ×1