From 0838ffb4106c73bc0dc65f65d5ab453a6b6a9fb0 Mon Sep 17 00:00:00 2001 From: Christoph Burgdorf Date: Fri, 5 Apr 2019 13:19:18 +0200 Subject: [PATCH] Perf: Don't create intermediate tuples in normalizer --- trinity/protocol/common/types.py | 7 +++++-- trinity/protocol/eth/normalizers.py | 28 ++++++++++++---------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/trinity/protocol/common/types.py b/trinity/protocol/common/types.py index 75c2d486f7..902dd1a331 100644 --- a/trinity/protocol/common/types.py +++ b/trinity/protocol/common/types.py @@ -38,8 +38,11 @@ ReceiptsBundles = Tuple[Tuple[Tuple[Receipt, ...], Tuple[Hash32, Dict[Hash32, bytes]]], ...] # (BlockBody, (txn_root, txn_trie_data), uncles_hash) -BlockBodyBundles = Tuple[Tuple[ + +BlockBodyBundle = Tuple[ BlockBody, Tuple[Hash32, Dict[Hash32, bytes]], Hash32, -], ...] +] + +BlockBodyBundles = Tuple[BlockBodyBundle, ...] diff --git a/trinity/protocol/eth/normalizers.py b/trinity/protocol/eth/normalizers.py index 3c1364e301..f16932be7c 100644 --- a/trinity/protocol/eth/normalizers.py +++ b/trinity/protocol/eth/normalizers.py @@ -1,9 +1,10 @@ from typing import ( + Iterable, Tuple, ) -from eth_utils.toolz import ( - compose, +from eth_utils import ( + to_tuple, ) from eth.db.trie import make_trie_root_and_nodes from eth_hash.auto import keccak @@ -13,6 +14,7 @@ BaseNormalizer, ) from trinity.protocol.common.types import ( + BlockBodyBundle, BlockBodyBundles, NodeDataBundles, ReceiptsBundles, @@ -26,7 +28,7 @@ class GetNodeDataNormalizer(BaseNormalizer[Tuple[bytes, ...], NodeDataBundles]): @staticmethod def normalize_result(msg: Tuple[bytes, ...]) -> NodeDataBundles: - node_keys = tuple(map(keccak, msg)) + node_keys = map(keccak, msg) result = tuple(zip(node_keys, msg)) return result @@ -36,7 +38,7 @@ class ReceiptsNormalizer(BaseNormalizer[ReceiptsByBlock, ReceiptsBundles]): @staticmethod def normalize_result(message: ReceiptsByBlock) -> ReceiptsBundles: - trie_roots_and_data = tuple(map(make_trie_root_and_nodes, message)) + trie_roots_and_data = map(make_trie_root_and_nodes, message) return tuple(zip(message, trie_roots_and_data)) @@ -44,15 +46,9 @@ class GetBlockBodiesNormalizer(BaseNormalizer[Tuple[BlockBody, ...], BlockBodyBu is_normalization_slow = True @staticmethod - def normalize_result(msg: Tuple[BlockBody, ...]) -> BlockBodyBundles: - uncles_hashes = tuple(map( - compose(keccak, rlp.encode), - tuple(body.uncles for body in msg) - )) - transaction_roots_and_trie_data = tuple(map( - make_trie_root_and_nodes, - tuple(body.transactions for body in msg) - )) - - body_bundles = tuple(zip(msg, transaction_roots_and_trie_data, uncles_hashes)) - return body_bundles + @to_tuple + def normalize_result(msg: Tuple[BlockBody, ...]) -> Iterable[BlockBodyBundle]: + for body in msg: + uncle_hashes = keccak(rlp.encode(body.uncles)) + transaction_root_and_nodes = make_trie_root_and_nodes(body.transactions) + yield body, transaction_root_and_nodes, uncle_hashes