好吧,看來我創建的東西,解決了這個問題,這裏的想法在python草案:
#!/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
,列表和其他函數可以替換爲使用API客戶端中的相應功能,但這是背後的粗略想法。
但是,代碼不是萬無一失的,解決方案應該是沿着這些路線的東西。
請求如何計算有效負載大小? –
您可能想閱讀[問]。 – boardrider
@JohnLaRooy我已將它添加到問題中。 – karolyi