diff --git a/eth/vm/code_stream.py b/eth/vm/code_stream.py
index <HASH>..<HASH> 100644
--- a/eth/vm/code_stream.py
+++ b/eth/vm/code_stream.py
@@ -39,12 +39,18 @@ class CodeStream(object):
     def __len__(self) -> int:
         return self._length_cache
 
-    def __iter__(self) -> 'CodeStream':
-        return self
-
     def __getitem__(self, i: int) -> int:
         return self._raw_code_bytes[i]
 
+    def __iter__(self) -> Iterator[int]:
+        # a very performance-sensitive method
+        read = self.read
+        try:
+            while True:
+                yield ord(read(1))
+        except TypeError:
+            yield STOP
+
     def __next__(self) -> int:
         # a very performance-sensitive method
         next_opcode_as_byte = self._bound_stream_read(1)
CodeStream.__iter__ speedup (<I>%)

Avoid a self.read references, byte check, and call overhead to
__next__() at every iteration (assuming that re-starting the generator
is faster than invoking __next__() again).

Pretty surprising that this didn't give more speedup actually. It's
essentially undetectable.