The ESP8266 (ESP-12E spec) has a 4MB Flash RAM and about 96KB of RAM.
One nice thing is you can use an async mode easily and it works great. So I took this very good complete tutorial on asyncio, and hacked a bit the micropython source code to offer to you a super-breeze async version
First of all I taken the last version of Micropython (1.10) and started to push to its limit to offer at least 44Kb to the interpreter. 51Kb is the theoretical limit, but you must left some space for the interpreter to work correctly.
To increase Micropython available memory, you must download Micropython source code and hack it. It is a bit complex, so a Linux machine is recommended, anyway I managed to to it on a Windows10 with linux subsystem (WSL) which is a bit slow but it is a nice environemnt to work with.
On this forum  I found some specific information, then I forked micropython code base (below you will find my proposed modifications, also a pre-made image is provided).
First of all edit heap size in main.c
This step needs a bit of caution, because the interpreter needs RAM to work correctly, but you can try to grab a few kilobytes
// From 36Kb....
STATIC char heap[36 * 1024];
// to whoppy 44Kb
STATIC char heap[44 * 1024];
Then we will liste all the C modules pre-compiled, using the help function:
__main__ hashlib socket upip
_boot inisetup ssl upip_utarfile
_onewire io struct urandom
_webrepl json sys ure
apa102 lwip time uselect
array machine uasyncio/__init__ usocket
binascii math uasyncio/core ussl
btree micropython ubinascii ustruct
builtins neopixel ucollections utime
collections network ucryptolib utimeq
dht ntptime uctypes uzlib
ds18x20 onewire uerrno webrepl
errno os uhashlib webrepl_setup
esp port_diag uheapq websocket
flashbdev random uio websocket_helper
framebuf re ujson zlib
gc select uos
Now the best way is to “scaffold” your micropython for the final target use. For instance I do not plan to use neopixel or frameuffers, because my little esp8266 will act like a server for tuning stuff on and off.
Also webrepl and websocket could be ripped off. At the end of my work, I ended with the following module list
__main__ io struct uos
_boot json sys upip
_onewire lwip time upip_utarfile
apa102 machine uasyncio/__init__ urandom
array math uasyncio/core ure
binascii micropython uasyncio/queues uselect
builtins network uasyncio/synchro usocket
collections ntptime ubinascii ussl
dht onewire ucollections ustruct
ds18x20 os ucryptolib utime
errno port_diag uctypes utimeq
esp random uerrno uzlib
flashbdev re uhashlib websocket
gc select uheapq websocket_helper
hashlib socket uio zlib
inisetup ssl ujson
I have prepared a forked git hub repository with my hacks : look at the daitan-hacks branch.
Download the ready made image!
- “Super Expander” version (Work in progress) 40Kb with basic uasyncio and no webrepl
- esp8266-experimental-v1.10.bin.zip Simpler version with asyncio and more RAM