为什么从我的程序中删除多处理会在 math.sin() 函数中抛出"A float is needed"错误?



我以前通过多处理实现了我的程序,但现在我使用Numba,所以我想删除多处理。但是,我遇到了一些问题。这里给出了程序的部分,我使用的是spyder 3.2.8版本,它使用的是python 2.7。

theta = 0
sin_theta = math.sin(math.radians(theta))

多处理器实现如下

dataset = []  
for i in range(0, 375, 15):
for j in range(0, 195, 15):
for k in range(0, 375, 15):
dataset.append([i, j, k])

agents = 40
chunksize = 4
pool = mp.Pool(processes = agents)
result = pool.map(calling, dataset, chunksize)

按照以下去除多处理后

import os
dataset = []  
for i in range(0, 375, 15):
for j in range(0, 195, 15):
for k in range(0, 375, 15):
dataset.append([i, j, k])

calling(dataset)

调用函数是

def calling(dataset):
l1 = dataset[0]
l2 = dataset[1]
l3 = dataset[2]

import random
i = random.sample(range(9000), 1)

t = 0
f = 0
z = 0

global g_r
global g_o

g_o_r = grid_one
global s_a_r, p_l
rt(p_l, l1, l2, l3, i)

rt功能是

def rt(p, f, t, z, i):
import math
import cmath
sin_t = math.sin(math.radians(t))
sin_f = math.sin(math.radians(f))
sin_z = math.sin(math.radians(z))
cos_t = math.cos(math.radians(t))
cos_f = math.cos(math.radians(f))
cos_z = math.cos(math.radians(z))

错误为

sin_t = math.sin(math.radians(t))
TypeError: a float is required

请告知是否需要任何进一步的信息或数据。

您的dataset是一个列表列表,每个列表包含三个元素。当使用多处理并通过pool.map传递dataset时,外部列表被迭代,三个元素的内部列表被传递给calling

因此,当你这样做时:

l1 = dataset[0]
l2 = dataset[1]
l3 = dataset[2]

l1、l2和l3中的每一个都包含内部列表的三个元素中的一个。

现在,您直接将dataset传递给calling,l1、l2和l3保存了dataset的前三个内部列表,所以基本上,您将列表[0, 0, 0][0, 0, 15][0, 0, 30]传递给了math.radians(),因此出现了错误。

要解决这个问题,只需像这样调用calling

for inner in dataset:
calling(inner)

相关内容

  • 没有找到相关文章

最新更新