首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:通过级联大小将字符串列表拆分为较小块的有效方法

Python:通过级联大小将字符串列表拆分为较小块的有效方法
EN

Stack Overflow用户
提问于 2015-06-22 11:38:31
回答 1查看 759关注 0票数 2

我正在通过它的google-api-python-client通过批处理请求与Google进行通信。在批处理请求中,有一些限制:

  • 批处理请求不能包含超过1000个请求,
  • 批处理请求在有效负载中不能包含超过1MB的内容。

我在列表中有随机长度字符串的随机数,在考虑到上述限制的同时,我需要从它构造一个批处理请求。

有谁知道如何有效地构建可以提交到Google的原始列表的块呢?我所说的“高效”指的是,不迭代第一部分中的所有元素(计算有效负载大小)。

到目前为止,这就是我所想到的:取最多1000条的项目,构建请求,查看有效负载大小。如果它大于1米,取500,看看大小。如果有效载荷较大,则取前250个项目。如果有效载荷较小,则取750项。以此类推,你就有了逻辑。这样,与每次添加后检查有效负载时构建有效负载相比,您可以获得正确的元素数量,且迭代次数较少。

我真的不想重新发明轮子,所以如果有人知道一个有效的内置/模块,请告诉我。

当向实例化的请求添加了适当数量的请求时,可以通过调用BatchHttpRequest来计算主体有效负载大小。

还请参阅关于批处理请求的Python客户端库文档

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-22 14:50:06

好的,我似乎创造了一些东西来解决这个问题,下面是python的一个想法草案:

代码语言:javascript
复制
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random
import string
import sys

MAX_LENGTH = 20
MAX_SIZE = 11111


def get_random():
    return ''.join([
        random.choice(string.ascii_letters) for i in range(
            random.randrange(10, 1000))])


def get_random_list():
    return [get_random() for i in range(random.randrange(50, 1000))]


def get_str_length(rnd_list, item_idx):
    return len(''.join(rnd_list[:item_idx]))

rnd_list = get_random_list()


def calculate_ideal_amount(rnd_list):
    list_bounds = {
        'first': 1,
        'last': len(rnd_list)
    }
    print ('ORIG_SIZE: %s, ORIG_LEN: %s' % (
        get_str_length(rnd_list, len(rnd_list)), len(rnd_list)))
    if get_str_length(rnd_list, list_bounds['first']) > MAX_SIZE:
        return 0
    if get_str_length(rnd_list, list_bounds['last']) <= MAX_SIZE and \
            list_bounds['last'] <= MAX_LENGTH:
        return list_bounds['last']
    while True:
        difference = round((list_bounds['last'] - list_bounds['first']) / 2)
        middle_item_idx = list_bounds['first'] + difference
        str_len = get_str_length(
            rnd_list, middle_item_idx)
        print(
            'MAX_SIZE: %s, list_bounds: %s, '
            'middle_item_idx: %s, diff: %s, str_len: %s,' % (
                MAX_SIZE, list_bounds, middle_item_idx, difference, str_len))
        # sys.stdin.readline()
        if str_len > MAX_SIZE:
            list_bounds['last'] = middle_item_idx
            continue
        if middle_item_idx > MAX_LENGTH:
            return MAX_LENGTH
        list_bounds['first'] = middle_item_idx
        if difference == 0:
            if get_str_length(rnd_list, list_bounds['last']) <= MAX_SIZE:
                if list_bounds['last'] > MAX_LENGTH:
                    return MAX_LENGTH
                return list_bounds['last']
            return list_bounds['first']

ideal_idx = calculate_ideal_amount(rnd_list)

print (
    len(rnd_list), get_str_length(rnd_list, len(rnd_list)),
    get_str_length(rnd_list, ideal_idx), ideal_idx,
    get_str_length(rnd_list, ideal_idx + 1))

这段代码和我所描述的完全一样,在测量返回的(级联的)大小的同时,找到和修改列表的边界,然后返回应该切片的列表的索引,以实现最有效的字符串大小。该方法避免了逐个编译和测量列表的CPU开销。运行此代码将显示它在列表上所做的迭代。

可以替换get_str_length、lists和其他函数,以便在API中使用相应的功能,但这是背后的粗略想法。

然而,代码并不是万无一失的,解决方案应该是这样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30979036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档