IO Redirection to Console

2015-12-10 Thread austin aigbe
Hello,

I am trying to port the following C++ code for IO redirection to console.

// C++ (from Synfig)

void redirectIOToConsole()
{
int hConHandle;
HANDLE lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp;

// allocate console
if( GetStdHandle(STD_OUTPUT_HANDLE) != INVALID_HANDLE_VALUE )
AllocConsole();
// set the screen buffer to be big enough to let us scroll text
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = MAX_LINES;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), 
coninfo.dwSize);
//redirect unbuffered STDOUT to the console
lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle((intptr_t) lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
// redirect unbuffered STDIN to the console
lStdHandle = GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle((intptr_t) lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "r" );
*stdin = *fp;
setvbuf( stdin, NULL, _IONBF, 0 );
// redirect unbuffered STDERR to the console
lStdHandle = GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle((intptr_t) lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stderr = *fp;
setvbuf( stderr, NULL, _IONBF, 0 );
// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog 
// point to console as well
ios::sync_with_stdio();
}



My Python port:

from ctypes import windll, create_string_buffer,Structure, byref
from ctypes.wintypes import DWORD,SHORT, WORD
import os
import msvcrt
import sys

STD_INPUT_HANDLE  = -10
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE  = -12
INVALID_HANDLE_VALUE = DWORD(-1).value

MAX_LINES = 500

def consoleOptionEnabled(argv):
value = False
if ("--console" in argv) or ("-c" in argv):
value = True
return value

def redirectIOToConsole():
class CONSOLE_SCREEN_BUFFER_INFO(Structure):
_fields_ = [("dwSize", COORD),
("dwCursorPosition", COORD),
("wAttributes", WORD),
("srWindow", SMALL_RECT),
("dwMaximumWindowSize", DWORD)]

coninfo = CONSOLE_SCREEN_BUFFER_INFO()

# allocate console
if(windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) != 
INVALID_HANDLE_VALUE):
windll.kernel32.AllocConsole()

# set the screen buffer to be big enough to let us scroll text

windll.kernel32.GetConsoleScreenBufferInfo(windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE),
 byref(coninfo))
coninfo.dwSize.Y = MAX_LINES

windll.kernel32.SetConsoleScreenBufferSize(windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE),
 coninfo.dwSize)

#redirect unbuffered STDOUT to the console
lStdHandle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)

hConHandle = msvcrt.open_osfhandle(lStdHandle, os.O_TEXT)
fp = os.fdopen( hConHandle, "w" )
sys.stdout = fp
setvbuf( stdout, NULL, _IONBF, 0 )
# redirect unbuffered STDIN to the console
lStdHandle = windll.kernel32.GetStdHandle(STD_INPUT_HANDLE)
hConHandle = msvcrt.open_osfhandle(lStdHandle, os.O_TEXT)
fp = os.fdopen( hConHandle, "r" )
sys.stdin = fp
setvbuf( stdin, NULL, _IONBF, 0 )

#redirect unbuffered STDERR to the console
lStdHandle = windll.kernel32.GetStdHandle(STD_ERROR_HANDLE)
hConHandle = msvcrt.open_osfhandle(lStdHandle, os.O_TEXT)
fp = os.fdopen( hConHandle, "w" )
sys.stderr = fp
setvbuf( stderr, NULL, _IONBF, 0 )
# make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog 
# point to console as well


Is there a better way to handling IO redirection to console in Python?

Thanks.

Austin
-- 
https://mail.python.org/mailman/listinfo/python-list


Python IO Redirection to Console

2015-12-13 Thread austin aigbe
Hello,

I am trying to redirect the IO (stdout, stdin and stderr) to the console.
Is there a Python module for this?

Thanks.

Regards
-- 
https://mail.python.org/mailman/listinfo/python-list


list comparison vs integer comparison, which is more efficient?

2015-01-03 Thread austin aigbe
Hi,

I am currently implementing the LTE physical layer in Python (ver 2.7.7).
For the qpsk, 16qam and 64qam modulation I would like to know which is more 
efficient to use, between an integer comparison and a list comparison:

Integer comparison: bit_pair as an integer value before comparison

# QPSK - TS 36.211 V12.2.0, section 7.1.2, Table 7.1.2-1
def mp_qpsk(self):
r = []
for i in range(self.nbits/2):
bit_pair = (self.sbits[i*2] << 1) | self.sbits[i*2+1] 
if bit_pair == 0:
r.append(complex(1/math.sqrt(2),1/math.sqrt(2)))
elif bit_pair == 1:
r.append(complex(1/math.sqrt(2),-1/math.sqrt(2)))
elif bit_pair == 2:
r.append(complex(-1/math.sqrt(2),1/math.sqrt(2)))
elif bit_pair == 3:
r.append(complex(-1/math.sqrt(2),-1/math.sqrt(2)))
return r

List comparison: bit_pair as a list before comparison

# QPSK - TS 36.211 V12.2.0, section 7.1.2, Table 7.1.2-1
def mp_qpsk(self):
r = []
for i in range(self.nbits/2):
bit_pair = self.sbits[i*2:i*2+2] 
if bit_pair == [0,0]:
r.append(complex(1/math.sqrt(2),1/math.sqrt(2)))
elif bit_pair == [0,1]:
r.append(complex(1/math.sqrt(2),-1/math.sqrt(2)))
elif bit_pair == [1,0]:
r.append(complex(-1/math.sqrt(2),1/math.sqrt(2)))
elif bit_pair == [1,1]:
r.append(complex(-1/math.sqrt(2),-1/math.sqrt(2)))
return r

Thanks
-- 
https://mail.python.org/mailman/listinfo/python-list


Re: list comparison vs integer comparison, which is more efficient?

2015-01-04 Thread austin aigbe
On Sunday, January 4, 2015 8:12:10 AM UTC+1, Terry Reedy wrote:
> On 1/3/2015 6:19 PM, austin aigbe wrote:
> 
> > I am currently implementing the LTE physical layer in Python (ver 2.7.7).
> > For the qpsk, 16qam and 64qam modulation I would like to know which is more 
> > efficient to use, between an integer comparison and a list comparison:
> >
> > Integer comparison: bit_pair as an integer value before comparison
> >
> >  # QPSK - TS 36.211 V12.2.0, section 7.1.2, Table 7.1.2-1
> >  def mp_qpsk(self):
> >  r = []
> >  for i in range(self.nbits/2):
> >  bit_pair = (self.sbits[i*2] << 1) | self.sbits[i*2+1]
> >  if bit_pair == 0:
> >  r.append(complex(1/math.sqrt(2),1/math.sqrt(2)))
> >  elif bit_pair == 1:
> >  r.append(complex(1/math.sqrt(2),-1/math.sqrt(2)))
> >  elif bit_pair == 2:
> >  r.append(complex(-1/math.sqrt(2),1/math.sqrt(2)))
> >  elif bit_pair == 3:
> >  r.append(complex(-1/math.sqrt(2),-1/math.sqrt(2)))
> >  return r
> >
> > List comparison: bit_pair as a list before comparison
> >
> >  # QPSK - TS 36.211 V12.2.0, section 7.1.2, Table 7.1.2-1
> >  def mp_qpsk(self):
> >  r = []
> >  for i in range(self.nbits/2):
> >  bit_pair = self.sbits[i*2:i*2+2]
> >  if bit_pair == [0,0]:
> >  r.append()
> >  elif bit_pair == [0,1]:
> >  r.append(complex(1/math.sqrt(2),-1/math.sqrt(2)))
> >  elif bit_pair == [1,0]:
> >  r.append(complex(-1/math.sqrt(2),1/math.sqrt(2)))
> >  elif bit_pair == [1,1]:
> >  r.append(complex(-1/math.sqrt(2),-1/math.sqrt(2)))
> >  return r
> 
> Wrong question.  If you are worried about efficiency, factor out all 
> repeated calculation of constants and eliminate the multiple comparisons.
> 
> sbits = self.sbits
> a = 1.0 / math.sqrt(2)
> b = -a
> points = (complex(a,a), complex(a,b), complex(b,a), complex(b,b))
>  complex(math.sqrt(2),1/math.sqrt(2))
> def mp_qpsk(self):
>  r = [points[sbits[i]*2 + sbits[i+1]]
>  for i in range(0, self.nbits, 2)]
>  return r
> 
> -- 
> Terry Jan Reedy

Cool. Thanks a lot.
-- 
https://mail.python.org/mailman/listinfo/python-list


Re: list comparison vs integer comparison, which is more efficient?

2015-01-04 Thread austin aigbe
On Sunday, January 4, 2015 12:20:26 PM UTC+1, austin aigbe wrote:
> On Sunday, January 4, 2015 8:12:10 AM UTC+1, Terry Reedy wrote:
> > On 1/3/2015 6:19 PM, austin aigbe wrote:
> > 
> > > I am currently implementing the LTE physical layer in Python (ver 2.7.7).
> > > For the qpsk, 16qam and 64qam modulation I would like to know which is 
> > > more efficient to use, between an integer comparison and a list 
> > > comparison:
> > >
> > > Integer comparison: bit_pair as an integer value before comparison
> > >
> > >  # QPSK - TS 36.211 V12.2.0, section 7.1.2, Table 7.1.2-1
> > >  def mp_qpsk(self):
> > >  r = []
> > >  for i in range(self.nbits/2):
> > >  bit_pair = (self.sbits[i*2] << 1) | self.sbits[i*2+1]
> > >  if bit_pair == 0:
> > >  r.append(complex(1/math.sqrt(2),1/math.sqrt(2)))
> > >  elif bit_pair == 1:
> > >  r.append(complex(1/math.sqrt(2),-1/math.sqrt(2)))
> > >  elif bit_pair == 2:
> > >  r.append(complex(-1/math.sqrt(2),1/math.sqrt(2)))
> > >  elif bit_pair == 3:
> > >  r.append(complex(-1/math.sqrt(2),-1/math.sqrt(2)))
> > >  return r
> > >
> > > List comparison: bit_pair as a list before comparison
> > >
> > >  # QPSK - TS 36.211 V12.2.0, section 7.1.2, Table 7.1.2-1
> > >  def mp_qpsk(self):
> > >  r = []
> > >  for i in range(self.nbits/2):
> > >  bit_pair = self.sbits[i*2:i*2+2]
> > >  if bit_pair == [0,0]:
> > >  r.append()
> > >  elif bit_pair == [0,1]:
> > >  r.append(complex(1/math.sqrt(2),-1/math.sqrt(2)))
> > >  elif bit_pair == [1,0]:
> > >  r.append(complex(-1/math.sqrt(2),1/math.sqrt(2)))
> > >  elif bit_pair == [1,1]:
> > >  r.append(complex(-1/math.sqrt(2),-1/math.sqrt(2)))
> > >  return r
> > 
> > Wrong question.  If you are worried about efficiency, factor out all 
> > repeated calculation of constants and eliminate the multiple comparisons.
> > 
> > sbits = self.sbits
> > a = 1.0 / math.sqrt(2)
> > b = -a
> > points = (complex(a,a), complex(a,b), complex(b,a), complex(b,b))
> >  complex(math.sqrt(2),1/math.sqrt(2))
> > def mp_qpsk(self):
> >  r = [points[sbits[i]*2 + sbits[i+1]]
> >  for i in range(0, self.nbits, 2)]
> >  return r
> > 
> > -- 
> > Terry Jan Reedy
> 
> Cool. Thanks a lot.

Hi Terry,

No difference between the int and list comparison in terms of the number of 
calls(24) and time (0.004s). Main part is the repeated call to sqrt().

However, it took a shorter time (0.004s) with 24 function calls than your code 
(0.005s) which took just 13 function calls to execute.

Why is this?

Integer comparison profile result:
>>> p = pstats.Stats('lte_phy_mod.txt')
>>> p.strip_dirs().sort_stats(-1).print_stats()
Sun Jan 04 12:36:32 2015lte_phy_mod.txt

 24 function calls in 0.004 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
10.0040.0040.0040.004 lte_phy_layer.py:16()
10.0000.0000.0000.000 lte_phy_layer.py:20(Scrambling)
10.0000.0000.0000.000 lte_phy_layer.py:276(LayerMapping)

10.0000.0000.0000.000 lte_phy_layer.py:278(Precoding)
10.0000.0000.0000.000 
lte_phy_layer.py:280(ResourceElementMapping)
10.0000.0000.0000.000 
lte_phy_layer.py:282(OFDMSignalGenerator)
10.0000.0000.0000.000 lte_phy_layer.py:65(Modulation)
10.0000.0000.0000.000 lte_phy_layer.py:71(__init__)
10.0000.0000.0000.000 lte_phy_layer.py:87(mp_qpsk)
10.0000.0000.0000.000 {len}
80.0000.0000.0000.000 {math.sqrt}
40.0000.0000.0000.000 {method 'append' of 'list' 
objects}
10.0000.0000.0000.000 {method 'disable' of 
'_lsprof.Profiler' objects}
10.0000.0000.0000.000 {range}



>>>

List comparison:
>>> import pstats
>>> p = pstats.Stats('lte_phy_mod2.txt')
>>> p.strip_dirs().sort_stats(-1).print_stats()
Sun Jan 04 12:57:24 2015lte_phy_mod2.txt

 24 function calls in 0.004 seconds

   Ordered by: stan