analitics

Pages

Monday, April 29, 2019

Python 3.7.3 : Get location of International Space Station.

Today I tested the urllib python module with python 3.7.3 and json python module.
The issue was to get the location of International Space Station - Open Notify.
The International Space Station is moving at close to 28,000 km/h so its location changes really fast! Where is it right now?
This is an open source project to provide a simple programming interface for some of NASA’s awesome data.
I do some of the work to take raw data and turn them into APIs related to space and spacecraft.
C:\Python373>python.exe
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD6
4)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib.request
>>> with urllib.request.urlopen('http://api.open-notify.org/iss-now.json') as f:
        print(f.read(300))
...
b'{"iss_position": {"longitude": "-86.9247", "latitude": "-38.3744"}, "message":
 "success", "timestamp": 1556575039}'
>>> with urllib.request.urlopen('http://api.open-notify.org/iss-now.json') as f:
...     source = f.read()
...     data = json.loads(source)
...
>>> print(data)
{'iss_position': {'longitude': '151.1941', 'latitude': '49.4702'}, 'message': 's
uccess', 'timestamp': 1556578621}
>>> print(data['iss_position']['longitude'])
151.1941
>>> print(data['iss_position']['latitude'])
49.4702
>>> print(data['message'])
success

Sunday, April 28, 2019

Python 3.7.3 and memory_profiler python module.

Today I will come up with a simpler and more effective tutorial in python programming.
First, I need to install the psutil python module for the example of this tutorial.
C:\Python373>cd Scripts
C:\Python373\Scripts>pip install psutil
Python memory monitor is very important for debugging application performance and fix bugs.
You can solve this issue is the python module named memory_profiler, see more here.
Let's install this python module with the pip python tool:
C:\Python373\Scripts>pip install memory_profiler
Let's start with a simple python script example:
import psutil

def test_psutil():
 # gives a single float value
 print(psutil.cpu_percent())
 # gives an object with many fields
 print(psutil.virtual_memory())
 # you can convert that object to a dictionary 
 print(dict(psutil.virtual_memory()._asdict()))
if __name__ == '__main__':
 test_psutil()

C:\Python373>python psutil_001.py
0.0
svmem(total=4171108352, available=1153679360, percent=72.3, used=3017428992, fre
e=1153679360)
{'total': 4171108352, 'available': 1153671168, 'percent': 72.3, 'used': 30174371
84, 'free': 1153671168}
The same result can see if you use memory_profiler
C:\Python373>python -m memory_profiler psutil_001.py
100.0
svmem(total=4171108352, available=1149018112, percent=72.5, used=3022090240, fre
e=1149018112)
{'total': 4171108352, 'available': 1149087744, 'percent': 72.5, 'used': 30220206
08, 'free': 1149087744}
Let's decorate python source code with @profile annotation to have a good output.
import psutil
@profile
def test_psutil():
 # gives a single float value
 print(psutil.cpu_percent())
 # gives an object with many fields
 print(psutil.virtual_memory())
 # you can convert that object to a dictionary 
 print(dict(psutil.virtual_memory()._asdict()))
if __name__ == '__main__':
 test_psutil()

Sure, this error tells us the decorate not working in the default way.
C:\Python373>python psutil_001.py
Traceback (most recent call last):
  File "psutil_001.py", line 2, in 
    @profile
NameError: name 'profile' is not defined
In this case, the decorate profile works great with the python module and give us all the information we need:
C:\Python373>python -m memory_profiler psutil_001.py
100.0
svmem(total=4171108352, available=1022672896, percent=75.5, used=3148435456, fre
e=1022672896)
{'total': 4171108352, 'available': 1022783488, 'percent': 75.5, 'used': 31483248
64, 'free': 1022783488}
Filename: psutil_001.py

Line #    Mem usage    Increment   Line Contents
================================================
     2   15.219 MiB   15.219 MiB   @profile
     3                             def test_psutil():
     4                                  # gives a single float value
     5   15.230 MiB    0.012 MiB        print(psutil.cpu_percent())
     6                                  # gives an object with many fields
     7   15.230 MiB    0.000 MiB        print(psutil.virtual_memory())
     8                                  # you can convert that object to a dicti
onary
     9   15.234 MiB    0.004 MiB        print(dict(psutil.virtual_memory()._asdi
ct()))
Let's test with another python script named 001.py :
from memory_profiler import profile

@profile(precision=4)
def test():
    a = 0
    a = a + 1

if __name__ == "__main__":
    test()
The result with precision=4 is this:
C:\Python373>python -m memory_profiler 001.py
Filename: 001.py

Line #    Mem usage    Increment   Line Contents
================================================
     3  15.3945 MiB  15.3945 MiB   @profile(precision=4)
     4                             def test():
     5  15.3945 MiB   0.0000 MiB       a = 0
     6  15.3945 MiB   0.0000 MiB       a = a + 1
If we change the precision=1 then this is the result:
C:\Python373>python -m memory_profiler 002.py
Filename: 002.py

Line #    Mem usage    Increment   Line Contents
================================================
     3     15.4 MiB     15.4 MiB   @profile(precision=1)
     4                             def test():
     5     15.4 MiB      0.0 MiB       a = 0
     6     15.4 MiB      0.0 MiB       a = a + 1
A good source of information for this python module can be found at GitHub.