
koder
03.06.2019
18:38:38
Блин, напиши разрабам, они, походу, не в курсе
собственно скорость далеко не самая основная проблема всего этого. uvloop ее в меру лечит.
Там куча проблем, поэтому и trio есть и curio, и из них тащат логику. Часть в 3.7 полечили,
но еще осталось.

toby
03.06.2019
19:11:11
generator1[0] => generator2[0] => generator3[0] => generator1[1] => generator2[1] => generator3[1]
как будет выглядеть такой скрипт?
сначала нулевой элемент генератора1, потом нулевой элемент генератора2 итд

Google

Alex
03.06.2019
19:11:33
если прямо хочешь всю последовательность лениво - напиши генератор с двумя вложенными циклами и yield

koder
03.06.2019
19:13:35

Alex
03.06.2019
19:13:51

toby
03.06.2019
19:13:52
да, вот итертулс идеально подойдет

koder
03.06.2019
19:14:18
а, я понял
ок

Alex
03.06.2019
19:15:45
в 2.x был itertools.izip

Евгений
03.06.2019
19:17:10

toby
03.06.2019
19:17:23
a, b = (x for x in range(5)), (y for y in range(5))
for i in a:
yield i
for j in b:
yield b
что то типо такого?

Alex
03.06.2019
19:17:39

Aragaer
03.06.2019
19:17:59
нет, там есть другое

Google

koder
03.06.2019
19:18:21
сча

Aragaer
03.06.2019
19:19:41
>>> list(itertools.chain.from_iterable(zip('abc', 'def', 'xyz')))
['a', 'd', 'x', 'b', 'e', 'y', 'c', 'f', 'z']

koder
03.06.2019
19:20:24
У меня есть пара вопросом по тестам.
Есть замер нагрузки CPU по uvloop и asyncio. А по потокам есть замеры нагрузки CPU?
https://github.com/koder-ua/network_ping_test/blob/master/perf_report.md#%D0%B4%D0%BE%D0%BB%D1%8F-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B2-user-mode-%D0%B2%D0%BE-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F-%D1%82%D0%B5%D1%81%D1%82%D0%B0-%D0%BE%D0%BA%D1%80%D1%83%D0%B3%D0%BB%D0%B5%D0%BD%D0%BE-%D0%B4%D0%BE-5-10
и там прямо в yaml с результатами сырые данные
https://github.com/koder-ua/network_ping_test/blob/master/results/unified_test_results2.yaml

Aragaer
03.06.2019
19:20:33
простой чейн может сплющить список кортежей в просто список, а фром итерабл может достать их из зипа

Alex
03.06.2019
19:20:46
>>> list(itertools.chain.from_iterable(zip('abc', 'def', 'xyz')))
['a', 'd', 'x', 'b', 'e', 'y', 'c', 'f', 'z']
как вариант

koder
03.06.2019
19:21:10
@kzh3ka а чуть выше итоги трассирования perf совершаемых системных выховов

Alex
03.06.2019
19:32:25
да, вот итертулс идеально подойдет
держи
def myzip(*args):
iters = [iter(arg) for arg in args]
num_active = len(iters)
while True:
for i, it in enumerate(iters):
if it is None:
continue
try:
yield next(it)
except StopIteration:
num_active -= 1
if not num_active:
return
iters[i] = None
print(list(myzip('abc', 'defg', 'hij')))
это если нужен честный обход генераторов по очереди. если нет - вон выше пример от @aragaer однострочник
только учти что zip обходит последовательности пока хотя бы одна из них не закончится (т.е. работает по самой короткой последовательности)

toby
03.06.2019
19:38:54
А возможно ли сделать по самой длинной?

Alex
03.06.2019
19:38:59
itertoos.zip_longest обходит по самой длинной последовательности
подставляя значения fillvalue аргумента вместо тех что уже знакончились

toby
03.06.2019
19:40:47
Примерно такая вот проблема, поэтому хочу использовать лениво
test_obj - словарь со значениями, который мы получаем из циклов
как все циклы завершились => objects['tests'].append(test_obj), добавляем в массив test_obj (куда стрелочка зеленая показывает)

Alex
03.06.2019
19:40:55
>>> list(itertools.chain.from_iterable(itertools.zip_longest('abc', 'defg', 'xyz', fillvalue='-')))
['a', 'd', 'x', 'b', 'e', 'y', 'c', 'f', 'z', '-', 'g', '-']

Карлос
03.06.2019
19:41:54
кто напишет чекер соксов ? (географию)

Alex
03.06.2019
19:46:43

toby
03.06.2019
19:47:24
Чтоб перейти к следующему циклу сразу

Google

toby
03.06.2019
19:47:32
Чисто псевдокод, идея такая прост

polunin.ai???
03.06.2019
19:47:47
Эм

toby
03.06.2019
19:47:49
Непонятно было как лениво это все организовать

Alex
03.06.2019
19:47:53
херь какая-то

polunin.ai???
03.06.2019
19:48:19
А зачем лениво?:

Alex
03.06.2019
19:48:25

toby
03.06.2019
19:50:10
Хороший вопрос, я думал это может помочь решить проблему таким образом

polunin.ai???
03.06.2019
19:51:21
А где проблема?

toby
03.06.2019
19:51:53
Вероятно, для моей проблемы будет достаточно найти самый длинный массив, range(len(arr)), 4 элемента добавлять в test_obj, потом obj['tests'].append(test_obj), если какой то элемент пустой - не добавлять его в test_obj

polunin.ai???
03.06.2019
19:52:44
Может таки скажете, в чем заключается проблема?

toby
03.06.2019
19:56:12
У нас есть 3 словаря с результатами тестов, 1 словарь - логи, 2 словарь - другие логи, 3 словарь - проверка тестов
В каждом словаре есть ключи, в первом - name, во втором - status test, в третьем - excepted results и actual results
Мы должны сделать 4 словарь, по ключу tests у нас есть массив с тестами
В массиве каждый элемент это 4 параметра, которые я написал в сообщение выше

polunin.ai???
03.06.2019
19:57:31
Словарь с логами например как организован?
id_test: {status: str}?

Alex
03.06.2019
19:58:19
в смысле словаря?
может быть у тебя списки словарей?

toby
03.06.2019
19:58:44
{
"logs": [
{
"time": "946684810",
"test": "Test output A",
"output": "fail"
}
]
}
{
"suites": [
{
"name": "suite1",
"tests": 1,
"cases": [
{
"name": "Test output B",
"errors": 0,
"time": "Saturday, 01-Jan-00 00:00:20 UTC"
}
]
}
]
}
{
"captures": [
{
"expected": "B"
"actual": "B",
"time": "2000-01-01T00:00:20+00:00"
},
{
"expected": "A"
"actual": "B",
"time": "2000-01-01T00:00:10+00:00"
}
]
}
вот три словаря
нужно объеденить их в четвертый
fourth_dict = {'tests': [ ]}

Google

Alex
03.06.2019
19:59:43
zip(a[“logs”], b[“suits”], c[“captures”])
дальше собирай итоговый словарь и пиши в список или делай yield

toby
03.06.2019
20:00:56
почему хотел по одному собирать этот словарь, вдруг значение невалидное, тогда пишем пустую строку в параметр

Alex
03.06.2019
20:01:34
ну так и собирай, zip ленивый

toby
03.06.2019
20:02:05
for i in range(length_test_class_1):
test_obj = {}
test_obj['name_test'] = test_class_2.suites[i]['name']
test_obj['status_test'] = test_class_1.logs[i]['output']
test_obj['excepted'] = test_class_3.captures[i]['expected']
test_obj['actual'] = test_class_3.captures[i]['actual']
data.test_5['tests'].append({data.prefix + str(i): test_obj})
вот у меня пока такое получилось) но это ужос
а как мне с зипом считать i? у меня же там массив объектов
test_obj['name_test'] = test_class_2.suites[0]['name']
test_obj['name_test'] = test_class_2.suites[1]['name']
итд

Alex
03.06.2019
20:03:30
for log, suite, capture in zip(a[“logs”], b[“suites”], c[“captures”]):
test_obj = {}
test_obj[‘name_test’] = suite[‘name’]
…

Aragaer
03.06.2019
20:03:37
нинада рейндж по длине
надо enumerate

Alex
03.06.2019
20:05:14
не надо enumerate, у него N списков.

toby
03.06.2019
20:05:42
TypeError: list indices must be integers or slices, not str
how to fix?

Alex
03.06.2019
20:06:14

wicker
03.06.2019
20:06:23
Ну ёпта, в гуголь переводчик

toby
03.06.2019
20:07:08
class Attributes1:
def __init__(self, json_dict: dict):
for k, v in json_dict.items():
if isinstance(v, dict):
value = Attributes1(v)
else:
k = f'{k}_' if iskeyword(k) else k
value = v
self.__dict__[k] = value
def __repr__(self):
return self.logs
допустим как логи показываем

Aragaer
03.06.2019
20:07:16
for i, suite, log, capture in enumerate(zip(test_class_2.suites, test_class_1.logs, test_class_3.captures):
data.test_5['tests'].append({data.prefix+str(i): {'name_test': suite['name'], 'status_test': log['output'], 'excepted': capture['expected'], 'actual': capture['actual']}})

toby
03.06.2019
20:07:17
через точку
создаем объект

Google

toby
03.06.2019
20:07:49
a.logs => показывает по ключу logs

Alex
03.06.2019
20:08:18
так ладно, я спать. у нас тут уже классы пошли на кой-то хрен. но трейсбеки мы читать не умеем.

toby
03.06.2019
20:10:00
ок, спасибо за помощ

polunin.ai???
03.06.2019
20:11:01

toby
03.06.2019
20:11:14

koder
03.06.2019
20:17:58
for i, (suite, log, capture) in ....