Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python随机分词函数的优化错误_Python_Optimization_Random_Split_Word - Fatal编程技术网

Python随机分词函数的优化错误

Python随机分词函数的优化错误,python,optimization,random,split,word,Python,Optimization,Random,Split,Word,我写了一个分词函数。它将一个单词拆分为随机字符。例如,如果输入为“运行时”,则以下每个输出中都可能有一个: ['runtime'] ['r','untime'] ['r','u','n','t','i','m','e'] .... 但当我想拆分10万个单词时,它的运行时间非常高。你有什么建议可以优化它或更智能地编写它吗 def random_multisplitter(word): from numpy import mod spw = [] length = len(

我写了一个分词函数。它将一个单词拆分为随机字符。例如,如果输入为“运行时”,则以下每个输出中都可能有一个:

['runtime']
['r','untime']
['r','u','n','t','i','m','e']
....
但当我想拆分10万个单词时,它的运行时间非常高。你有什么建议可以优化它或更智能地编写它吗

def random_multisplitter(word):
    from numpy import mod
    spw = []
    length = len(word)
    rand = random_int(word)
    if rand == length:       #probability of not splitting
        return [word]

    else:
        div = mod(rand, (length + 1))  #defining division points 
        bound = length - div
        spw.append(div)
        while div != 0:
            rand = random_int(word)
            div = mod(rand,(bound+1))
            bound = bound-div
            spw.append(div)
        result = spw
    b = 0
    points =[]
    for x in range(len(result)-1): #calculating splitting points 
        b=b+result[x]
        points.append(b)
    xy=0
    t=[]
    for i in points:
        t.append(word[xy:i])
        xy=i
    if word[xy:len(word)]!='':
        t.append(word[xy:len(word)])
    if type(t)!=list:
        return [t]
    return t

我不明白你在那里做什么,但是对于你的代码来说,结果肯定不尽相同。因此,代码不起作用,实际上StackOverflow可能是正确的位置,即使您不知道。
我怎么知道你的代码不起作用?这个它看起来很可疑,所以我用你的函数生成了一百万个样本,得到了这个分布:

请注意,y轴的比例是对数的,这些估计的概率变化很大

所以现在有些代码速度更快,并且实际产生的结果也同样可能:

def random_multisplitter(word):
    # add's bits will tell whether a char shall be added to last substring or
    # be the beginning of its own substring
    add = random.randint(0, 2**len(word) - 1)

    # append 0 to make sure first char is start of first substring
    add <<= 1

    res = []
    for char in word:
        # see if last bit is 1
        if add & 1:
            res[-1] += char
        else:
            res.append(char)
        # shift to next bit
        add >>= 1

    return res
def随机多分裂器(word):
#add的位将告诉您是将字符添加到最后一个子字符串还是
#是其自身子字符串的开始
add=random.randint(0,2**len(word)-1)
#追加0以确保第一个字符是第一个子字符串的开始
相加=1
返回res
这就是Blckknght的建议,信不信由你,在他们发表评论前一个小时,我也有同样的想法,但我没有时间写这个答案。
无论如何,下面是该函数的估计概率:

所有聚集在1/64=0.015625(绿线)附近,表明概率分布是均匀的


我的机器上使用python2.7时,此函数的计时时间为4.56µs,而您的函数的计时时间为20.1µs。

我不知道您在那里做什么,但对于您的代码来说,结果肯定不尽相同。因此,代码不起作用,实际上StackOverflow可能是正确的位置,即使您不知道。
我怎么知道你的代码不起作用?这个它看起来很可疑,所以我用你的函数生成了一百万个样本,得到了这个分布:

请注意,y轴的比例是对数的,这些估计的概率变化很大

所以现在有些代码速度更快,并且实际产生的结果也同样可能:

def random_multisplitter(word):
    # add's bits will tell whether a char shall be added to last substring or
    # be the beginning of its own substring
    add = random.randint(0, 2**len(word) - 1)

    # append 0 to make sure first char is start of first substring
    add <<= 1

    res = []
    for char in word:
        # see if last bit is 1
        if add & 1:
            res[-1] += char
        else:
            res.append(char)
        # shift to next bit
        add >>= 1

    return res
def随机多分裂器(word):
#add的位将告诉您是将字符添加到最后一个子字符串还是
#是其自身子字符串的开始
add=random.randint(0,2**len(word)-1)
#追加0以确保第一个字符是第一个子字符串的开始
相加=1
返回res
这就是Blckknght的建议,信不信由你,在他们发表评论前一个小时,我也有同样的想法,但我没有时间写这个答案。
无论如何,下面是该函数的估计概率:

所有聚集在1/64=0.015625(绿线)附近,表明概率分布是均匀的


我的机器上使用python2.7时,此函数的计时时间为4.56µs,而您的函数的计时时间为20.1µs。

您真的需要同时使用所有不同的版本吗?这是干什么用的?基于迭代器而不是列表肯定会节省内存。如果您有工作代码,并且只对优化/改进感兴趣,那么stackexchange可能是一个更好的发布位置,如果您想查看他们的感谢,我将查看迭代器。它一次返回一个版本,我想代码可能会更智能,但我现在找不到一种方法。你期望什么样的随机分布?是否所有可能的拆分都以相同的概率返回?您的
random\u int
函数做什么(它似乎将字符串作为参数并返回整数)?如果我实现了这个,并且想要一个统一的分布,我会选择一个0和
2**len(word)-1之间的统一随机整数,并在设置位的位置拆分。random\u int只返回一个0-len(word)之间的数字。我的情况是通过生成数字从右到左拆分单词,直到没有字符为止。例如:start'Runtime''run''time'random number==3't''ime'random number==1'ime'random number==3(无拆分)返回['run''t''ime']在这种情况下,每个可能的输出都有相同的概率您实际上需要同时使用所有不同的版本吗?这是干什么用的?基于迭代器而不是列表肯定会节省内存。如果您有工作代码,并且只对优化/改进感兴趣,那么stackexchange可能是一个更好的发布位置,如果您想查看他们的感谢,我将查看迭代器。它一次返回一个版本,我想代码可能会更智能,但我现在找不到一种方法。你期望什么样的随机分布?是否所有可能的拆分都以相同的概率返回?您的
random\u int
函数做什么(它似乎将字符串作为参数并返回整数)?如果我实现了这个,并且想要一个统一的分布,我会选择一个0和
2**len(word)-1之间的统一随机整数,并在设置位的位置拆分。random\u int只返回一个0-len(word)之间的数字。我的情况是通过生成数字从右到左拆分单词,直到没有字符为止。例如:start“Runtime”“run”“time”随机数==3“t”“ime”随机数==1“ime”随机数==3(无拆分)返回['run”“t”“ime']在这种情况下,每个可能的输出都有相同的概率hımm非常感谢您这种方法非常有效better@SerkanKumyol如果有效,那么接受答案并投票hımm非常感谢您这种方法非常有效better@SerkanKumyol如果有效,那么接受答案并投票表决