BoboTiG / python-mss

An ultra fast cross-platform multiple screenshots module in pure Python using ctypes.
https://pypi.org/project/mss/
MIT License
998 stars 88 forks source link

Mac: reduce the number of function calls #182

Closed BoboTiG closed 4 years ago

BoboTiG commented 4 years ago

Changes proposed in this PR

sourcery-ai[bot] commented 4 years ago

Sourcery Code Quality Report (beta)

✅  Merging this PR will increase code quality in the affected files by 0.02 out of 10.

Quality metrics Before After Change
Complexity 1.20 1.20 0.00
Method Length 74.55 73.35 -1.20 🔵
Quality 8.36 8.38 0.02 🔵
Other metrics Before After Change
Lines 185 184 -1
Changed files Quality Before Quality After Quality Change
mss/darwin.py 8.36 8.38 0.02 🔵

Here are some functions in these files that still need a tune-up:

File Function Complexity Length Overall Recommendation
mss/darwin.py MSS._grab_impl 6 190.90 5.69 Split out functionality
mss/darwin.py MSS._set_cfunctions 0 208.84 6.10 Split out functionality
mss/darwin.py MSS._monitors_impl 3 176.82 6.16 Split out functionality

Please see our documentation here for details on how these metrics are calculated.

We are actively working on this report - lots more documentation and extra metrics to come!

Let us know what you think of it by mentioning @sourcery-ai in a comment.

BoboTiG commented 4 years ago

A disassembling of the code show a reduction of calls:

import mss
import dis

with mss.mss() as sct:
    dis.dis(sct._grab_impl)
Before the patch ``` 177 0 LOAD_FAST 0 (self) 2 LOAD_ATTR 0 (core) 4 STORE_FAST 2 (core) 178 6 LOAD_GLOBAL 1 (CGRect) 179 8 LOAD_FAST 1 (monitor) 10 LOAD_CONST 1 ('left') 12 BINARY_SUBSCR 14 LOAD_FAST 1 (monitor) 16 LOAD_CONST 2 ('top') 18 BINARY_SUBSCR 20 BUILD_TUPLE 2 22 LOAD_FAST 1 (monitor) 24 LOAD_CONST 3 ('width') 26 BINARY_SUBSCR 28 LOAD_FAST 1 (monitor) 30 LOAD_CONST 4 ('height') 32 BINARY_SUBSCR 34 BUILD_TUPLE 2 178 36 CALL_FUNCTION 2 38 STORE_FAST 3 (rect) 182 40 LOAD_FAST 2 (core) 42 LOAD_METHOD 2 (CGWindowListCreateImage) 44 LOAD_FAST 3 (rect) 46 LOAD_CONST 5 (1) 48 LOAD_CONST 6 (0) 50 LOAD_CONST 6 (0) 52 CALL_METHOD 4 54 STORE_FAST 4 (image_ref) 183 56 LOAD_FAST 4 (image_ref) 58 POP_JUMP_IF_TRUE 68 184 60 LOAD_GLOBAL 3 (ScreenShotError) 62 LOAD_CONST 7 ('CoreGraphics.CGWindowListCreateImage() failed.') 64 CALL_FUNCTION 1 66 RAISE_VARARGS 1 186 >> 68 LOAD_GLOBAL 4 (int) 70 LOAD_FAST 2 (core) 72 LOAD_METHOD 5 (CGImageGetWidth) 74 LOAD_FAST 4 (image_ref) 76 CALL_METHOD 1 78 CALL_FUNCTION 1 80 STORE_FAST 5 (width) 187 82 LOAD_GLOBAL 4 (int) 84 LOAD_FAST 2 (core) 86 LOAD_METHOD 6 (CGImageGetHeight) 88 LOAD_FAST 4 (image_ref) 90 CALL_METHOD 1 92 CALL_FUNCTION 1 94 STORE_FAST 6 (height) 188 96 LOAD_CONST 8 (None) 98 DUP_TOP 100 STORE_FAST 7 (prov) 102 STORE_FAST 8 (copy_data) 189 104 SETUP_FINALLY 194 (to 300) 190 106 LOAD_FAST 2 (core) 108 LOAD_METHOD 9 (CGImageGetDataProvider) 110 LOAD_FAST 4 (image_ref) 112 CALL_METHOD 1 114 STORE_FAST 7 (prov) 191 116 LOAD_FAST 2 (core) 118 LOAD_METHOD 10 (CGDataProviderCopyData) 120 LOAD_FAST 7 (prov) 122 CALL_METHOD 1 124 STORE_FAST 8 (copy_data) 192 126 LOAD_FAST 2 (core) 128 LOAD_METHOD 11 (CFDataGetBytePtr) 130 LOAD_FAST 8 (copy_data) 132 CALL_METHOD 1 134 STORE_FAST 9 (data_ref) 193 136 LOAD_FAST 2 (core) 138 LOAD_METHOD 12 (CFDataGetLength) 140 LOAD_FAST 8 (copy_data) 142 CALL_METHOD 1 144 STORE_FAST 10 (buf_len) 194 146 LOAD_GLOBAL 13 (ctypes) 148 LOAD_METHOD 14 (cast) 150 LOAD_FAST 9 (data_ref) 152 LOAD_GLOBAL 13 (ctypes) 154 LOAD_METHOD 15 (POINTER) 156 LOAD_GLOBAL 13 (ctypes) 158 LOAD_ATTR 16 (c_ubyte) 160 LOAD_FAST 10 (buf_len) 162 BINARY_MULTIPLY 164 CALL_METHOD 1 166 CALL_METHOD 2 168 STORE_FAST 11 (raw) 195 170 LOAD_GLOBAL 17 (bytearray) 172 LOAD_FAST 11 (raw) 174 LOAD_ATTR 18 (contents) 176 CALL_FUNCTION 1 178 STORE_FAST 12 (data) 198 180 LOAD_GLOBAL 4 (int) 182 LOAD_FAST 2 (core) 184 LOAD_METHOD 19 (CGImageGetBytesPerRow) 186 LOAD_FAST 4 (image_ref) 188 CALL_METHOD 1 190 CALL_FUNCTION 1 192 STORE_FAST 13 (bytes_per_row) 199 194 LOAD_GLOBAL 4 (int) 196 LOAD_FAST 2 (core) 198 LOAD_METHOD 20 (CGImageGetBitsPerPixel) 200 LOAD_FAST 4 (image_ref) 202 CALL_METHOD 1 204 CALL_FUNCTION 1 206 STORE_FAST 14 (bytes_per_pixel) 200 208 LOAD_FAST 14 (bytes_per_pixel) 210 LOAD_CONST 9 (7) 212 BINARY_ADD 214 LOAD_CONST 10 (8) 216 BINARY_FLOOR_DIVIDE 218 STORE_FAST 14 (bytes_per_pixel) 202 220 LOAD_FAST 14 (bytes_per_pixel) 222 LOAD_FAST 5 (width) 224 BINARY_MULTIPLY 226 LOAD_FAST 13 (bytes_per_row) 228 COMPARE_OP 3 (!=) 230 EXTENDED_ARG 1 232 POP_JUMP_IF_FALSE 296 203 234 LOAD_GLOBAL 17 (bytearray) 236 CALL_FUNCTION 0 238 STORE_FAST 15 (cropped) 204 240 LOAD_GLOBAL 21 (range) 242 LOAD_FAST 6 (height) 244 CALL_FUNCTION 1 246 GET_ITER >> 248 FOR_ITER 42 (to 292) 250 STORE_FAST 16 (row) 205 252 LOAD_FAST 16 (row) 254 LOAD_FAST 13 (bytes_per_row) 256 BINARY_MULTIPLY 258 STORE_FAST 17 (start) 206 260 LOAD_FAST 17 (start) 262 LOAD_FAST 5 (width) 264 LOAD_FAST 14 (bytes_per_pixel) 266 BINARY_MULTIPLY 268 BINARY_ADD 270 STORE_FAST 18 (end) 207 272 LOAD_FAST 15 (cropped) 274 LOAD_METHOD 22 (extend) 276 LOAD_FAST 12 (data) 278 LOAD_FAST 17 (start) 280 LOAD_FAST 18 (end) 282 BUILD_SLICE 2 284 BINARY_SUBSCR 286 CALL_METHOD 1 288 POP_TOP 290 JUMP_ABSOLUTE 248 208 >> 292 LOAD_FAST 15 (cropped) 294 STORE_FAST 12 (data) >> 296 POP_BLOCK 298 BEGIN_FINALLY 210 >> 300 LOAD_FAST 7 (prov) 302 EXTENDED_ARG 1 304 POP_JUMP_IF_FALSE 316 211 306 LOAD_FAST 2 (core) 308 LOAD_METHOD 7 (CGDataProviderRelease) 310 LOAD_FAST 7 (prov) 312 CALL_METHOD 1 314 POP_TOP 212 >> 316 LOAD_FAST 8 (copy_data) 318 EXTENDED_ARG 1 320 POP_JUMP_IF_FALSE 332 213 322 LOAD_FAST 2 (core) 324 LOAD_METHOD 8 (CFRelease) 326 LOAD_FAST 8 (copy_data) 328 CALL_METHOD 1 330 POP_TOP >> 332 END_FINALLY 215 334 LOAD_FAST 0 (self) 336 LOAD_ATTR 23 (cls_image) 338 LOAD_FAST 12 (data) 340 LOAD_FAST 1 (monitor) 342 LOAD_GLOBAL 24 (Size) 344 LOAD_FAST 5 (width) 346 LOAD_FAST 6 (height) 348 CALL_FUNCTION 2 350 LOAD_CONST 11 (('size',)) 352 CALL_FUNCTION_KW 3 354 RETURN_VALUE ```
After the patch ``` 176 0 LOAD_FAST 0 (self) 2 LOAD_ATTR 0 (core) 4 STORE_FAST 2 (core) 177 6 LOAD_GLOBAL 1 (CGRect) 178 8 LOAD_FAST 1 (monitor) 10 LOAD_CONST 1 ('left') 12 BINARY_SUBSCR 14 LOAD_FAST 1 (monitor) 16 LOAD_CONST 2 ('top') 18 BINARY_SUBSCR 20 BUILD_TUPLE 2 22 LOAD_FAST 1 (monitor) 24 LOAD_CONST 3 ('width') 26 BINARY_SUBSCR 28 LOAD_FAST 1 (monitor) 30 LOAD_CONST 4 ('height') 32 BINARY_SUBSCR 34 BUILD_TUPLE 2 177 36 CALL_FUNCTION 2 38 STORE_FAST 3 (rect) 181 40 LOAD_FAST 2 (core) 42 LOAD_METHOD 2 (CGWindowListCreateImage) 44 LOAD_FAST 3 (rect) 46 LOAD_CONST 5 (1) 48 LOAD_CONST 6 (0) 50 LOAD_CONST 6 (0) 52 CALL_METHOD 4 54 STORE_FAST 4 (image_ref) 182 56 LOAD_FAST 4 (image_ref) 58 POP_JUMP_IF_TRUE 68 183 60 LOAD_GLOBAL 3 (ScreenShotError) 62 LOAD_CONST 7 ('CoreGraphics.CGWindowListCreateImage() failed.') 64 CALL_FUNCTION 1 66 RAISE_VARARGS 1 185 >> 68 LOAD_FAST 2 (core) 70 LOAD_METHOD 4 (CGImageGetWidth) 72 LOAD_FAST 4 (image_ref) 74 CALL_METHOD 1 76 STORE_FAST 5 (width) 186 78 LOAD_FAST 2 (core) 80 LOAD_METHOD 5 (CGImageGetHeight) 82 LOAD_FAST 4 (image_ref) 84 CALL_METHOD 1 86 STORE_FAST 6 (height) 187 88 LOAD_CONST 8 (None) 90 DUP_TOP 92 STORE_FAST 7 (prov) 94 STORE_FAST 8 (copy_data) 188 96 SETUP_FINALLY 186 (to 284) 189 98 LOAD_FAST 2 (core) 100 LOAD_METHOD 8 (CGImageGetDataProvider) 102 LOAD_FAST 4 (image_ref) 104 CALL_METHOD 1 106 STORE_FAST 7 (prov) 190 108 LOAD_FAST 2 (core) 110 LOAD_METHOD 9 (CGDataProviderCopyData) 112 LOAD_FAST 7 (prov) 114 CALL_METHOD 1 116 STORE_FAST 8 (copy_data) 191 118 LOAD_FAST 2 (core) 120 LOAD_METHOD 10 (CFDataGetBytePtr) 122 LOAD_FAST 8 (copy_data) 124 CALL_METHOD 1 126 STORE_FAST 9 (data_ref) 192 128 LOAD_FAST 2 (core) 130 LOAD_METHOD 11 (CFDataGetLength) 132 LOAD_FAST 8 (copy_data) 134 CALL_METHOD 1 136 STORE_FAST 10 (buf_len) 193 138 LOAD_GLOBAL 12 (ctypes) 140 LOAD_METHOD 13 (cast) 142 LOAD_FAST 9 (data_ref) 144 LOAD_GLOBAL 12 (ctypes) 146 LOAD_METHOD 14 (POINTER) 148 LOAD_GLOBAL 12 (ctypes) 150 LOAD_ATTR 15 (c_ubyte) 152 LOAD_FAST 10 (buf_len) 154 BINARY_MULTIPLY 156 CALL_METHOD 1 158 CALL_METHOD 2 160 STORE_FAST 11 (raw) 194 162 LOAD_GLOBAL 16 (bytearray) 164 LOAD_FAST 11 (raw) 166 LOAD_ATTR 17 (contents) 168 CALL_FUNCTION 1 170 STORE_FAST 12 (data) 197 172 LOAD_FAST 2 (core) 174 LOAD_METHOD 18 (CGImageGetBytesPerRow) 176 LOAD_FAST 4 (image_ref) 178 CALL_METHOD 1 180 STORE_FAST 13 (bytes_per_row) 198 182 LOAD_FAST 2 (core) 184 LOAD_METHOD 19 (CGImageGetBitsPerPixel) 186 LOAD_FAST 4 (image_ref) 188 CALL_METHOD 1 190 STORE_FAST 14 (bytes_per_pixel) 199 192 LOAD_FAST 14 (bytes_per_pixel) 194 LOAD_CONST 9 (7) 196 BINARY_ADD 198 LOAD_CONST 10 (8) 200 BINARY_FLOOR_DIVIDE 202 STORE_FAST 14 (bytes_per_pixel) 201 204 LOAD_FAST 14 (bytes_per_pixel) 206 LOAD_FAST 5 (width) 208 BINARY_MULTIPLY 210 LOAD_FAST 13 (bytes_per_row) 212 COMPARE_OP 3 (!=) 214 EXTENDED_ARG 1 216 POP_JUMP_IF_FALSE 280 202 218 LOAD_GLOBAL 16 (bytearray) 220 CALL_FUNCTION 0 222 STORE_FAST 15 (cropped) 203 224 LOAD_GLOBAL 20 (range) 226 LOAD_FAST 6 (height) 228 CALL_FUNCTION 1 230 GET_ITER >> 232 FOR_ITER 42 (to 276) 234 STORE_FAST 16 (row) 204 236 LOAD_FAST 16 (row) 238 LOAD_FAST 13 (bytes_per_row) 240 BINARY_MULTIPLY 242 STORE_FAST 17 (start) 205 244 LOAD_FAST 17 (start) 246 LOAD_FAST 5 (width) 248 LOAD_FAST 14 (bytes_per_pixel) 250 BINARY_MULTIPLY 252 BINARY_ADD 254 STORE_FAST 18 (end) 206 256 LOAD_FAST 15 (cropped) 258 LOAD_METHOD 21 (extend) 260 LOAD_FAST 12 (data) 262 LOAD_FAST 17 (start) 264 LOAD_FAST 18 (end) 266 BUILD_SLICE 2 268 BINARY_SUBSCR 270 CALL_METHOD 1 272 POP_TOP 274 JUMP_ABSOLUTE 232 207 >> 276 LOAD_FAST 15 (cropped) 278 STORE_FAST 12 (data) >> 280 POP_BLOCK 282 BEGIN_FINALLY 209 >> 284 LOAD_FAST 7 (prov) 286 EXTENDED_ARG 1 288 POP_JUMP_IF_FALSE 300 210 290 LOAD_FAST 2 (core) 292 LOAD_METHOD 6 (CGDataProviderRelease) 294 LOAD_FAST 7 (prov) 296 CALL_METHOD 1 298 POP_TOP 211 >> 300 LOAD_FAST 8 (copy_data) 302 EXTENDED_ARG 1 304 POP_JUMP_IF_FALSE 316 212 306 LOAD_FAST 2 (core) 308 LOAD_METHOD 7 (CFRelease) 310 LOAD_FAST 8 (copy_data) 312 CALL_METHOD 1 314 POP_TOP >> 316 END_FINALLY 214 318 LOAD_FAST 0 (self) 320 LOAD_ATTR 22 (cls_image) 322 LOAD_FAST 12 (data) 324 LOAD_FAST 1 (monitor) 326 LOAD_GLOBAL 23 (Size) 328 LOAD_FAST 5 (width) 330 LOAD_FAST 6 (height) 332 CALL_FUNCTION 2 334 LOAD_CONST 11 (('size',)) 336 CALL_FUNCTION_KW 3 338 RETURN_VALUE ```